执行下面的命令,创建Maven工程wrapper-test.
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.freebird.app -DartifactId=wrapper-test
然后按照提示进行操作(Maven官方文档有点老旧,和最新的情况脱节):
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 171:
Choose org.apache.maven.archetypes:maven-archetype-quickstart version:
1: 1.0-alpha-1
2: 1.0-alpha-2
3: 1.0-alpha-3
4: 1.0-alpha-4
5: 1.0
6: 1.1
Choose a number: 6:
[INFO] Using property: groupId = com.freebird.app
[INFO] Using property: artifactId = wrapper-test
Define value for property 'version': 1.0-SNAPSHOT: :
[INFO] Using property: package = com.freebird.app
Confirm properties configuration:
groupId: com.freebird.app
artifactId: wrapper-test
version: 1.0-SNAPSHOT
package: com.freebird.app
Y: : y
好了,工程创建好了。代码也很简单:
package com.freebird.app; /** * Hello world! * */ public class App { public static void main( String[] args ) { System.out.println( "Hello World!" ); } }
执行mvn clean package 打成一个jar文件:wrapper-test-1.0-SNAPSHOT.jar
sudo -s
cd /usr
wget http://wrapper.tanukisoftware.com/download/3.5.14/wrapper-linux-x86-64-3.5.14.tar.gz
tar zxvf wrapper-linux-x86-64-3.5.14.tar.gz
在~/.bashrc文件尾部中增加下面两句:
export WRAPPER_HOME=/usr/wrapper-linux-x86-64-3.5.14
export PATH=$WRAPPER_HOME/bin:$PATH
然后执行:
source ~/.bashrc
http://wrapper.tanukisoftware.com/doc/english/launch-nix.html
http://mojo.codehaus.org/appassembler/appassembler-maven-plugin/usage_jsw.html
在wrapper-test目录下创建bin目录,然后复制一些脚本文件到该目录下:
cd ./bin
cp ${WRAPPER_HOME}/bin/wrapper ./
cp ${WRAPPER_HOME}/src/bin/sh.script.in ./myapp
编辑myapp脚本文件,修改名称:
# Application
APP_NAME="@app.name@"
APP_LONG_NAME="@app.long.name@"
==》
# Application
APP_NAME="myapp"
APP_LONG_NAME="My application"
注意,myapp脚本里面默认配置需要一个兄弟目录conf目录,里面需要一个wrapper.conf文件。
WRAPPER_CONF="../conf/wrapper.conf"
在wrapper-test目录下创建conf目录,然后复制配置文件到该目录下:
cd ./conf
cp ${WRAPPER_HOME}/src/conf/wrapper.conf.in ./wrapper.conf
注意,这时候默认使用的是Integration Method 1(WrapperSimpleApp)
看看这里就知道:http://wrapper.tanukisoftware.com/doc/english/integrate.html
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
但是我需要的服务是能够接受外部停止和启动命令,所以决定使用第二种方式。因此上面被我修改成:
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperStartStopApp
然后
将@app.name@替换成myapp
将@app.long.name@替换成My application
将@app.description@替换成My first wrapper application
并且将启动类设置为App
# Application parameters. Add parameters as needed starting from 1
wrapper.app.parameter.1=com.freebird.app.App
wrapper.app.parameter.2=1
wrapper.app.parameter.3=start
wrapper.app.parameter.4=com.freebird.app.App
wrapper.app.parameter.5=TRUE
wrapper.app.parameter.6=1
wrapper.app.parameter.7=stop
这些参数的设定文档参考:http://wrapper.tanukisoftware.com/doc/english/integrate-start-stop-win.html#parameter
基本上分成两组,我已经用空行分开,一组用于设置启动类和启动参数,另一组用于设置关闭类和关闭参数。
创建另一个兄弟目录logs.
创建兄弟目录lib,然后复制一些wrapper service的库文件进来。
cd lib
cp ${WRAPPER_HOME}/lib/libwrapper.so ./
cp ${WRAPPER_HOME}/lib/wrapper.jar ./
同时将wrapper-test-1.0-SNAPSHOT.jar文件也放到lib目录下。然后修改一下wrapper.conf文件:
# Java Classpath (include wrapper.jar) Add class path elements as
# needed starting from 1
wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=../lib/wrapper-test-1.0-SNAPSHOT.jar
回到bin目录下,执行命令:./myapp console
打印出两行hello,world.运行成功。
第一次hello,world是接受了start参数,启动程序。第二次是接受了stop参数,关闭程序。触发第二次main函数被调用的原因是第一次main函数运行后自动结束,然后被WrapperManager监听到,因此发起了第二次调用。
如果将main修改一下,就只会出现一次hello,world.
package com.freebird.app; /** * Hello world! * */ public class App { public static void main( String[] args ) { System.out.println(args.length); System.out.println(args[0]); System.out.println( "Hello World!" ); while(true){ try{ Thread.sleep(1000); }catch(Throwable ex){ } } } }