今天写了一个很有趣的程序,每隔10秒刷一次某网站,提高网站流量。程序是通过MAIN方法运行的,我想打包成WINDOWS服务,这样我就不用打开Myeclipse运行了,将来如果要部署到服务器上也很方便,工作时听同事用过Java Service Wrapper,于是去官网了解了一下。花了1个小时,终于配置好了!部署完成后会有一个wrapper.log,它会记录你在程序里所有的System.out.print以及错误信息。
这里分享一下如何部署Java Service Wrapper,操作非常简单!
简单的说只需要将JAVA工程打包成JAR放到LIB目录下,然后改一下CONF下的配置即可。
一、前期准备,首先,下载Java Service Wrapper,http://sourceforge.net/projects/wrapper/files/ (国外网站,可能有时候无法下载,也可以使用VPN下载),若无法下载可以去这里:http://download.csdn.net/detail/programmer_sir/7877107
下载后解压,目录结构如下显示:
bin:里面是可执行文件,安装服务、启动服务、重启服务等。
conf:这是核心配置。所有配置均在这个目录下。(参考以下“配置CONF”)
lib:如果你的项目有很多LIB做支持,可以放在这个目录下,当然也可以新建一个,只需要Conf里配置下路径即可。
二、将java工程打包成jar.
我在myeclipse里新建了一个JAVA工程,如下结构:
写了一个Hello类,源码如下:
package org.wrapper;
/**
* 小程序。
* 每3秒说一次“你好,这是我的第一个Java Service Wrapper.”
* */
public class Hello {
int i = 1;
public void start(){
while (true) {
try {
Thread.sleep(3*1000);
System.out.println(i++ + "次说你好,这是我的第一个Java Service Wrapper.");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args){
new Hello().start();
}
}
在JAVA工程上右键--->Export--->java--->JAR File--->Next--->在JAR file位置选择路径--->Finish。
将打包的JAR放在LIB目录下,如果JAVA工程下有很多扩展的LIB,都可以拷贝到lib目录下或者自己新建一个文件夹。
三、配置Conf。
打开conf文件夹,找到wrapper.conf
1、wrapper.java.command=java
如果你的本机装了JRE,也就是如果装了JDK,这条可以跳过。如果没装,那需要将JDK整个文件夹下的JRE全复制到此根目录下(并且需要修改wrapper.java.command=找到JDK的JRE路径+java.exe)。实际上我建议是安装JDK。省事!
2、配置主方法,也就是服务启动时自动调用的类。
#填写服务启动调用的类(包名+类名)。如下:
wrapper.app.parameter.1=org.wrapper.Hello(wrapper.app.parameter.1默认是被#注释了的,记得去掉“#”)。
3、配置JAVA工程JAR路径。
上面用Myeclipse打包的JAR在这里要配置一下,找到
wrapper.java.classpath.1=../lib/wrapper.jar改成wrapper.java.classpath.1=../lib/*.jar
(“*”代表默认加载LIB下所有JAR)
如果要加多个不同文件夹下的LIB,那么可以在加wrapper.java.classpath.2=写你的路径。
4、配置内存大小。
配置程序运行的所需要的内存大小
# Initial Java Heap Size (in MB)
#wrapper.java.initmemory=3
# Maximum Java Heap Size (in MB)
#wrapper.java.maxmemory=64
可以改成(根据情况设置)
# Initial Java Heap Size (in MB)
wrapper.java.initmemory=64
# Maximum Java Heap Size (in MB)
wrapper.java.maxmemory=128
5、其它配置
# Name of the service
#windows服务是否自动启动
wrapper.ntservice.starttype=AUTO_START
我的CONF配置如下:
wrapper.lang.folder=../lang
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
# Java Classpath (include wrapper.jar) Add class path elements as
# needed starting from 1
wrapper.java.classpath.1=../lib/*.jar
#wrapper.java.classpath.2=其它LIB在这里配置。
# Java Library Path (location of Wrapper.DLL or libwrapper.so)
wrapper.java.library.path.1=../lib
# Java Bits. On applicable platforms, tells the JVM to run in 32 or 64-bit mode.
wrapper.java.additional.auto_bits=TRUE
# Java Additional Parameters
wrapper.java.additional.1=
# Initial Java Heap Size (in MB)
#wrapper.java.initmemory=64
# Maximum Java Heap Size (in MB)
#wrapper.java.maxmemory=128
# Application parameters. Add parameters as needed starting from 1
wrapper.app.parameter.1=org.wrapper.Hello
wrapper.console.format=PM
wrapper.console.loglevel=INFO
wrapper.logfile=../logs/wrapper.log
wrapper.logfile.format=LPTM
wrapper.logfile.loglevel=INFO
wrapper.logfile.maxsize=0
wrapper.logfile.maxfiles=0
wrapper.syslog.loglevel=NONE
wrapper.ignore_sequence_gaps=TRUE
wrapper.pidfile.strict=TRUE
wrapper.console.title=Test Wrapper Sample Application
wrapper.check.deadlock=TRUE
wrapper.check.deadlock.interval=10
wrapper.check.deadlock.action=RESTART
wrapper.check.deadlock.output=FULL
wrapper.filter.trigger.999=wrapper.filter.trigger.*java.lang.OutOfMemoryError
wrapper.filter.allow_wildcards.999=TRUE
wrapper.filter.action.999=NONE
wrapper.filter.trigger.1000=[Loaded java.lang.OutOfMemoryError
wrapper.filter.action.1000=NONE
wrapper.filter.trigger.1001=java.lang.OutOfMemoryError
wrapper.filter.action.1001=RESTART
wrapper.filter.message.1001=The JVM has run out of memory.
wrapper.event.jvm_restart.email.body=The JVM was restarted.\n\nPlease check on its status.\n
wrapper.name=Hello JavaServiceWrapper
wrapper.displayname=Hello JavaServiceWrapper
wrapper.description=这是我的第一个WINDOWS服务。
wrapper.ntservice.dependency.1=
wrapper.ntservice.starttype=AUTO_START
wrapper.ntservice.interactive=false
6、LIB目录下.bat解释
安装服务:InstallApp-NT.bat
启动服务:StartApp-NT.bat
暂停服务:auseApp-NT.bat
重启服务:ResumeApp-NT.bat
停止服务:StopApp-NT.bat
卸载服务:UninstallApp-NT.bat
上述配置完成后,点击InstallApp-NT.bat安装服务,然后在启动服务StartApp-NT.bat,此时可以在logs目录下查看wrapper.log。
STATUS | wrapper | 2014/09/07 22:24:48 | Launching a JVM...
INFO | jvm 1 | 2014/09/07 22:24:48 | WrapperManager: Initializing...
STATUS | wrapperm | 2014/09/07 22:24:52 | Hello JavaServiceWrapper started.
INFO | jvm 1 | 2014/09/07 22:24:51 | 1次说你好,这是我的第一个Java Service Wrapper.
INFO | jvm 1 | 2014/09/07 22:24:54 | 2次说你好,这是我的第一个Java Service Wrapper.
INFO | jvm 1 | 2014/09/07 22:24:57 | 3次说你好,这是我的第一个Java Service Wrapper.
INFO | jvm 1 | 2014/09/07 22:25:00 | 4次说你好,这是我的第一个Java Service Wrapper.
INFO | jvm 1 | 2014/09/07 22:25:04 | 5次说你好,这是我的第一个Java Service Wrapper.
INFO | jvm 1 | 2014/09/07 22:25:06 | 6次说你好,这是我的第一个Java Service Wrapper.
INFO | jvm 1 | 2014/09/07 22:25:09 | 7次说你好,这是我的第一个Java Service Wrapper.
INFO | jvm 1 | 2014/09/07 22:25:12 | 8次说你好,这是我的第一个Java Service Wrapper.
INFO | jvm 1 | 2014/09/07 22:25:16 | 9次说你好,这是我的第一个Java Service Wrapper.
INFO | jvm 1 | 2014/09/07 22:25:18 | 10次说你好,这是我的第一个Java Service Wrapper.
INFO | jvm 1 | 2014/09/07 22:25:21 | 11次说你好,这是我的第一个Java Service Wrapper.
INFO | jvm 1 | 2014/09/07 22:25:24 | 12次说你好,这是我的第一个Java Service Wrapper.
INFO | jvm 1 | 2014/09/07 22:25:28 | 13次说你好,这是我的第一个Java Service Wrapper.
INFO | jvm 1 | 2014/09/07 22:25:30 | 14次说你好,这是我的第一个Java Service Wrapper.
INFO | jvm 1 | 2014/09/07 22:25:33 | 15次说你好,这是我的第一个Java Service Wrapper.
INFO | jvm 1 | 2014/09/07 22:25:37 | 16次说你好,这是我的第一个Java Service Wrapper.
四、异常处理
1、如果报org.tanukisoftware.wrapper.test.Main不存在。
wrapper.java.mainclass=org.tanukisoftware.wrapper.test.Main
修改成
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
总之,如果报相关类不存在,就要仔细查看配置路径,以及LIB是否全等。
2.、所有错误均记录在log/wrapper.log下。
3、JVM did not exit on request, terminated ,如果报此错误说明你没有按我上面写的去配置,而是将主程序配置在了wrapper.java.mainclass,其实这种配置方式也可以,只是与我的写法不一样而已,如果你非要写在manclass,那具体解决方案可参考:http://bbs.csdn.net/topics/90143848 查看10楼回答。
4、There were 5 failed launches in a row, each lasting less than 300 seconds. Giving up。此错误是由于配置主方法导致的,注意wrapper.app.parameter.1的路径以及是否去掉了它前面的#。
五、源码配置打包免费下载
http://download.csdn.net/detail/programmer_sir/7877797