使用 wrapper 把jar打包成windows服务

windows编程 专栏收录该内容
8 篇文章 0 订阅

你是不是在找将Java程序注册成系统服务的方法?试试JavaServiceWrapper这个工具吧,你可以从这个网站上面下载你喜欢的版本:http://wrapper.tanukisoftware.org/ ,JavaServiceWrapper提供了适合市面上流行的操作系统的版本。

  使用WrapperJava程序注册成系统服务有三种方式可供选择:

  第一种是使用WrapperSimpleApp 这个帮助类来运行你的程序,这个是最简单的方法,也是官方推荐使用的方式,但是这样可能会对你的程序有改动,如果你在项目初期就开始考虑的话,这个方法还是不错的。像JBoss也是使用这种方式。

  第二种方式是使用WraperStartStopApp这个类来实现功能,这个方法适合那些通过ClassA类来负责启动服务,ClassB类来负责停止服务的应用场景。

  我使用的是第三种方式,这种方式好处是对程序改动比较小,只要让你的启动类实现WrapperListener接口,并实现接口中的start(String[]args) 和 stop(String[]args)方法,然后通过WrapperManager来启动。其他的一些配置比如要运行的主类全名、Java类路径、依赖Java库的路径、还有服务显示的名称,都可以通过配置文件conf/wrapper.conf来配置,相对来说比较灵活,像我目前在做的RCP项目有自动更新功能,更新下来的插件要比那些原来的插件的版本号要更新,虽然说会定期删除那些过期的插件,但有时还是会产生延迟,那么配置文件里面配置的Java类路径必须也要链接到最新的插件的地址,我是通过一个Java类来管理这个wrapper.confg文件,如果有更新的插件,通过Java类来得到最新插件的路径,将这些信息写入到wrapper.confg文件中,这样就能保证配置文件中的类路径是最新的了。

一.            运行环境

电脑上应该有java运行环境。

二.            需要软件

Java ServiceWrapper

下载地址:http://wrapper.tanukisoftware.org/

下载community 版,不要下载pro版,原因是wrapper并非完全免费的,pro 版会15分钟就重启一次wrapper.

我用的方法是 自己继承 WrapperListener 写main()类,这样可以实现对服务 启动和关闭的监听。

首先建立java工程,将 wrapper.jar导入工程,看下运行类:


package com.test;

import  org.tanukisoftware.wrapper.WrapperManager; 
import  org.tanukisoftware.wrapper.WrapperListener; 


public class TestService  implements   WrapperListener{

public void runService(){

         new Thread() {
                  public void run(){

                       try {
                               while(true){
                                        System.out.println("testService is running ...");
                                        Thread.sleep(1000);
                                 }

                        } catch (InterruptedException e) {
                               // TODO Auto-generated catch block
                              e.printStackTrace();
                        }

                  }
            }.start();
}


/**
* @param args
*/
public static void main(String[] args) {
         // TODO Auto-generated method stub

        System.out.println(    "Initializing... "   ); 
        WrapperManager.start(   new   TestService(),   args   ); 
}


public void controlEvent(int arg0) {
          // TODO Auto-generated method stub

}


public Integer start(String[] arg0) {
            // TODO Auto-generated method stub

            System.out.println("testService is start");
            TestService service = new TestService();
            service.runService();
            return null;
}


public int stop(int arg0) {
            // TODO Auto-generated method stub
            System.out.println("testService is stop");
            return 0;
}


}

接着把工程,编译并达成jar包。

三.            配置过程

1.      首先将java程序打成jar包。

2.      Java Service Wrapper包解压。

3.      比如要注册成服务的程序项目目录为workapp,那么在这个目录下面新建四个文件夹:

bin、conf、lib、logs。

4.      把Java Service Wrapper包中bin目录下的Wrapper.exe、src/bin目录下的App.bat.in、InstallApp-NT.bat.in、UninstallApp-NT.bat.in文件拷贝到workapp的bin目录中,并分别改名为App.bat、InstallApp-NT.bat、UninstallApp-NT.bat。

------------------我下载的直接就是App.bat.,因此不需要重名了-----------------

5.      把Java Service Wrapper包中lib目录下的Wrapper.DLL、wrapper.jar拷贝到workapp的lib目录中。并且将项目的jar和所用到的jar都拷贝到该目录。

6.      把Java Service Wrapper包中srcconf目录下的wrapper.conf.in拷贝到workapp的conf目录中,并命名为wrapper.conf。

7. 把 Java Service Wrapper包中logs 目录下文件wrapper.log拷贝过来,或者建立一个空文件 wrapper.log

8.      修改wrapper.conf配置文件,方法如下:

    主要修改以下几项即可:
    (1)JVM位置:
     wrapper.java.command=C:\jdk1.5.0_07\bin\java
    (2)运行参数:如:
     wrapper.java.additional.1=-Dprogram.name=run.bat
    (3)你的Java程序所需的jar包必须全部在此标明,注意路径准确:
     wrapper.java.classpath.1=../lib/wrapper.jar
     wrapper.java.classpath.2=../lib/test_fat.jar

……//列出用到的所有jar

    (4)你的Wrapper.DLL或wrapper.jar所在的目录
     wrapper.java.library.path.1=../lib

----------------------重点----------------------------------------------------------------------------
    (5)MAIN CLASS 此处决定了使用Java Service Wrapper的方式
    wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
    (6)你的Java应用程序的运行类
     wrapper.app.parameter.1= com.tes.Testjar

-----------------------重点---------------------------------------------------------------------------


我下载的wrapper-windows-x86-32-3.5.15-pro原来的配置

wrapper.java.mainclass=org.tanukisoftware.wrapper.test.Main

而我把它修改成知己的com.test.TestService

wrapper.java.mainclass=com.test.TestService

而  wrapper.app.parameter.1= com.tes.Testjar,我下载的这个参数配置是 # 号注释掉了,打开注释启动服务会报错。


在安装时有用的命令,特别是 》启动 
wrapper.exe -t wrapper.conf  可以实现安装后,立即启动服务。

》测试运行是否正常 
wrapper.exe -c wrapper.conf 
》安装服务 
wrapper.exe -i wrapper.conf 
》卸载服务 
wrapper.exe -r wrapper.conf 
》启动 
wrapper.exe -t wrapper.conf 
》停止 
wrapper.exe -p wrapper.conf

    (6)注册为服务的名称和显示名,你可以随意进行设置
     wrapper.ntservice.name=testService
     wrapper.ntservice.displayname= testService
    (7)服务描述信息
     wrapper.ntservice.description= my_testService

8.      修改好了以后,运行MyApp.bat即可运行你的java程序,这里可以测试配置的是否正确,如果可以运行,证明配置ok。

9.      运行InstallApp-NT.bat可以进行服务的注册,UninstallApp-NT.bat为注销服务。

10.  运行完注册服务InstallApp-NT.bat可以在 控制面板-管理程序-服务中看到你注册的服务名称。(如:testService


其他wrapper.conf配置项:

#window服务配置
wrapper.console.title=samplesvr
#服务名
wrapper.ntservice.name=samplesvr

# 显示名称
wrapper.ntservice.displayname= sample  Service

# 描述
wrapper.ntservice.description=sample Service

# 依赖项
wrapper.ntservice.dependency.1=

# 启动模式:  AUTO_START or DEMAND_START
wrapper.ntservice.starttype=AUTO_START

# 是否交互.
wrapper.ntservice.interactive=false


参考文档:http://wrapper.tanukisoftware.com/doc/english/integrate.html#method3

 

我遇到的问题:提示Timed out waiting for signal from JVM.

 

附上一个帖子的内容:

 

Symptoms

Seeing the following errors in the wrapper.log file.

JVM appears hung: Timed out waiting for signal from JVM.
ERROR | wrapper | 2009/02/23 03:39:39 | JVM did not exit on request, terminated
DEBUG | wrapper | 2009/02/23 03:39:40 | Waiting 5 seconds before launching another JVM.
STATUS | wrapper | 2009/02/23 03:39:44 | Launching a JVM...

Cause

This message usually occurs because your cpu is hitting 100% for around 30+ seconds.

See the article http://lists.hippo.nl/pipermail/hippocms-dev/2006-April/001488.html.

(Fisheye may use high CPU during the indexing process, or the high cpu may be caused by another application like svn).

Resolution

Try adding the parameter

wrapper.ping.timeout=120

to your wrapper.conf file, to increase the timeout period and thus prevent the JVM from being terminated. You will need to restart your server after setting this value.

 

网上的 一个模版:

请先下载wrapper-delta-pack.zip
实际上实现一个windows服务只需针对org.tanukisoftware.wrapper.WrapperListenerorg.tanukisoftware.wrapper.WrapperManager编程,
public class YourStartUpClass implements WrapperListener {

   
    /**
    * 此处只需一句话
    */

    public static void main(String[] args) {
         WrapperManager.start(new YourStartUpClass(), args);
    }

    public void controlEvent(int event) {
        // TODO Auto-generated method stub
       

    }

    public Integer start(String[] args) {
        System.out.println("start……" +args.length);
        //============
        //
这里启动你的服务程序
        //============
       WrapperManager.log(WrapperManager.WRAPPER_LOG_LEVEL_INFO, "YourServer start."); //
记日志
        return null;  //
关键,返回null表示成功
    }

   public int stop(int exitCode) {
        System.out.println("stop……");
        //============
        //
这里停止你的服务程序
        //============
        return 0;
    }
}

wrapper.conf中:
wrapper.java.mainclass=
这里写你的启动ClassName YourStartUpClass --注意是包含包名的全名
wrapper.java.classpath.1=../lib/wrappertest.jar
wrapper.java.classpath.2=../lib/wrapper.jar  //
这里要将所有classppath写全,注意最后一位必须是 1 2 3 4 5 6…不能重复.

wrapper.ntservice.name=你的服务名
wrapper.ntservice.description=
你的服务的详细描述

直接使用 bin/TestWrapper.bat就可以测试你的服务了
InstallTestWrapper-NT.bat
--安装服务
UninstallTestWrapper-NT.bat
--卸载服务

 

网上的一个帖子:

需要在有main()函数的class中
添加关于wrapper管理的相关程序

需要将wrapper相关的启动,停止方法嵌入这个class中
而不是像先前直接拿个jar就做服务

若想将一个jar用wrapper转换成NT服务
需要重写带有main()的class

以下是基本结构实例
希望对于和我碰到相同问题的人有所帮助

------------------------------
import   org.tanukisoftware.wrapper.WrapperActionServer;
import   org.tanukisoftware.wrapper.WrapperManager;
import   org.tanukisoftware.wrapper.WrapperListener;
import   org.tanukisoftware.wrapper.event.WrapperEventListener;

public   class   HelloWorld   implements   WrapperListener{
             
             private   HelloWorld()   {
             }

             public   Integer   start(   String[]   args   ){
                         System.out.println(    "start() "   );

                         try{
                                     System.out.println( "HelloWorld! ");
                         }
                         catch   (   Exception   e   ){}
                         return   null;
             }
             
             public   int   stop(   int   exitCode   ){
                         System.out.println(    "stop( "   +   exitCode   +    ") "   );
                         return   exitCode;
             }
             
             public   void   controlEvent(   int   event   ){
                         System.out.println(    "controlEvent( "   +   event   +    ") "   );
             }
             
             public   static   void   main(   String[]   args   ){
                         System.out.println(    "Initializing... "   );
                         WrapperManager.start(   new   HelloWorld(),   args   );
             }
}



http://wrapper.tanukisoftware.com/doc/english/integrate.html

  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值