• 使用Java Service Wrapper将Java程序发布成Windows Service艾泽拉斯之海洋女神出品


    使用Java Service WrapperJava程序发布成Windows Service

    Java Service Wrapper是一个可以将Java程序发布成Windows服务的工具,功能类似于JDK自带的Java Service不过更强大,而且支持Windows Server 2008等更多的操作系统。

    主要参考资料:

    http://www.blogjava.net/woxingwosu/archive/2007/11/28/163308.html

    http://topic.csdn.net/t/20060717/22/4886513.html

    1.   准备工具

    首先下载Java Service WrapperWindows版本,地址:http://sourceforge.net/projects/wrapper/files/

    目前sourceforge发布的最新版本是3.3.0,而官网http://wrapper.tanukisoftware.org上社区版的最新版本是3.4.0

    2.   准备代码

    要使用Java Service Wrapper,自己原有的程序必须进行一次改造或者添加一个包装类。这里使用一个最简单的HelloWorld类作为示例。

    package com.yjw;

     

    import javax.swing.JFrame;

    import javax.swing.JLabel;

     

    import org.tanukisoftware.wrapper.WrapperListener;

    import org.tanukisoftware.wrapper.WrapperManager;

     

    // 实现WrapperListener接口

    public class HelloWorld implements   WrapperListener{

        private static void createAndShowGUI() {

           JFrame.setDefaultLookAndFeelDecorated(true);

     

           JFrame frame = new JFrame("HelloWorldSwing");

           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

     

           JLabel label = new JLabel("Hello World");

           frame.getContentPane().add(label);

     

           frame.setSize(150, 100);

           frame.setVisible(true);

        }

     

        public static void main(String[] args) {

           javax.swing.SwingUtilities.invokeLater(new Runnable() {

               public void run() {

                  createAndShowGUI();

               }

           });

    //这里,启动HelloWold

           WrapperManager.start(   new   HelloWorld(),   args   );  

        }

    //需要一个start方法

        public Integer start(String[] args) {

           System.out.println("start()");

     

           try {

               System.out.println("HelloWorld!");

           } catch (Exception e) {

           }

           return null;

        }

    //需要一个stop方法

        public int stop(int exitCode) {

           System.out.println("stop(" + exitCode + ")");

           return exitCode;

        }

    //需要一个controlEvent方法

        public void controlEvent(int event) {

           System.out.println("controlEvent(" + event + ")");

        }

     

    }

    这里,直接把入口类进行了代码改造,用户也可以单独写一个包装类,把上面带注释的四个地方的代码提取出来,对自己原来的入口类进行包装。

    注意:如果没有对入口类进行java wrapper service需要的代码改造,则在做成服务后,表现为JVM试图不停地启动服务,查看wrapper.log,会发现类似如下的报错:

      INFO       |   wrapper     |   2010/04/16   21:24:58   |   Waiting   to   start...  
      INFO       |   wrapper     |   2010/04/16   21:25:03   |   Waiting   to   start...  
      INFO       |   wrapper     |   2010/04/16   21:25:08   |   Waiting   to   start...  
      ERROR     |   wrapper     |   2010/04/16   21:25:29   |   Startup   failed:   Timed   out   waiting   for   a   signal   from   the   JVM.  
      ------------------------------------------------------------------------  
      ADVICE   |   wrapper     |   2010/04/16   21:25:29   |    
      ERROR     |   wrapper     |   2010/04/16   21:25:29   |   JVM   did   not   exit   on   request,   terminated  
      FATAL     |   wrapper     |   2010/04/16   21:25:29   |   There   were   5   failed   launches   in   a   row,   each   lasting   less   than   300   seconds.     Giving   up.  
      FATAL     |   wrapper     |   2010/04/16   21:25:29   |       There   may   be   a   configuration   problem:   please   check   the   logs.  
      STATUS   |   wrapper     |   2010/04/16   21:25:29   |   <--   Wrapper   Stopped

    HelloWorld.java打成HelloWorld.jar

     

    3.   实现服务

    1)           准备工作区

    准备一个工作文件夹,例如test,在test下新建confloglib三个文件夹

     

    2)           将下载下来的java wrapper service解压缩

    a) Java Service Wrapper包中bin下的wrapper.exe拷贝至test

    b) Java Service Wrapper包中src/bin下的App.bat.in(测试运行),InstallApp-NT.bat.in(安装windows服务),UninstallApp-NT.bat.in(卸载windows服务)拷贝至test下,并且将后缀.in去掉

    c) 修改App.batInstallApp-NT.batUninstallApp-NT.bat中的set _WRAPPER_CONF="%_REALPATH%conf\wrapper.conf"

    d) conf文件夹下的wrapper.conf拷贝至test/conf

    e) Java Service Wrapper包中lib下的Wrapper.DLLwrapper.jar拷贝至test/lib

     

    3)           准备可用jar

    HelloWorld.jar此时还不能直接使用,需要进行改造

    a) HelloWorld.jar解压缩,提取META-INF/MANIFEST.MF文件

    b) 打开MANIFEST.MF,在Class-Path中追加wrapper.jar wrapper.dll

    c) HelloWorld.jar和改造过的MANIFEST.MF一起拷贝到%JAVA_HOME%/bin

    d) 打开cmd窗口,将路径切换至%JAVA_HOME%/bin

    e) 输入命令jar umf MANIFEST.MF HelloWorld.jar,此时HelloWorld.jar中的MANIFEST.MF已被更新为当前的MANIFEST.MF

    f)   将更新后的HelloWorld.jar拷贝至test/lib

     

    4)           配置wrapper.conf

    打开test/conf/wrapper.conf

     

    #程序的入口

    wrapper.java.mainclass=com.yjw.HelloWorld

     

    #程序jar,包括wrapper.jar

    wrapper.java.classpath.1=lib/HelloWorld.jar

    wrapper.java.classpath.2=lib/wrapper.jar

     

    #程序的文件夹,这里为lib

    wrapper.java.library.path.1=lib

     

    #注意:有的教程注释为程序的入口,虽然能够正常运行,但是这是概念性错误!

    #这个参数指传给主程序的参数入口,比如笔者有个程序,传值0表示为英文版,1为中文版,参数就在这里配置。如果有多个参数,请自行配置

    #为wrapper.app.parameter.n=XXX

    wrapper.app.parameter.1=1

     

    #日志文件生成的位置

    wrapper.logfile=log/wrapper.log

     

    #windows服务所需的标题,名称,显示名和描述
    wrapper.console.title=HelloWorld
    wrapper.ntservice.name= HelloWorld
    wrapper.ntservice.displayname= HelloWorld
    wrapper.ntservice.description= HelloWorld

     

    5)           运行App.bat,如果没有错误出现,说明配置正常,就可以运行InstallApp-NT.bat将你的程序做成Windows服务了。所有信息都可以在log/wrapper.log日志文件里找到

     

    6)           如果要打开调试信息,在test/conf/wrapper.conf中将wrapper.debug=TRUE前面的#号去掉即可打开调试功能

  • 相关阅读:
    css3 练习
    onethink 返回上一页
    小程序之轮播图
    Node 基本使用
    IDEA Terminal
    Spring Shell简单应用
    Spring Theme简单应用
    Spring MVC的学习笔记
    Win10出现键盘未失灵,按下的键都是快捷键的问题
    SQL Server 添加描述
  • 原文地址:https://www.cnblogs.com/Cindy_weiwei/p/1715196.html
Copyright © 2020-2023  润新知