使用Java Service Wrapper将Java程序发布成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 Wrapper的Windows版本,地址: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下新建conf,log,lib三个文件夹
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.bat,InstallApp-NT.bat,UninstallApp-NT.bat中的set _WRAPPER_CONF="%_REALPATH%conf\wrapper.conf"
d) 将conf文件夹下的wrapper.conf拷贝至test/conf下
e) 将Java Service Wrapper包中lib下的Wrapper.DLL,wrapper.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前面的#号去掉即可打开调试功能