使用说明
一.下载Java Service Wrapper包
下载后解压该包(下载到/opt目录中),本次下载的是wrapper-linux-x86-64-3.5.51.tar.gz
tar -zxvf wrapper-linux-x86-64-3.5.51.tar.gz
二.新建项目目录(本次使用foss)
在新建的目录中创建以下4个目录:bin,conf,lib,logs
mkdir -p /opt/foss/bin
mkdir -p /opt/foss/conf
mkdir -p /opt/foss/lib
mkdir -p /opt/foss/logs
三.复制解压后的文件到新建的目录中
cp /opt/wrapper-linux-x86-64-3.5.51/src/bin/App.sh.in /opt/foss/bin
cp /opt/wrapper-linux-x86-64-3.5.51/src/bin/App.shconf.in /opt/foss/bin
cp /opt/wrapper-linux-x86-64-3.5.51/src/conf/wrapper.conf.in /opt/foss/conf
cp /opt/wrapper-linux-x86-64-3.5.51/bin/wrapper /opt/foss/bin
cp /opt/wrapper-linux-x86-64-3.5.51/lib/wrapper.jar /opt/foss/lib
cp /opt/wrapper-linux-x86-64-3.5.51/lib/libwrapper.so /opt/foss/lib
mv /opt/foss/bin/App.sh.in /opt/foss/bin/app.sh
mv /opt/foss/bin/App.shconf.in /opt/foss/bin/app.shconf
mv /opt/foss/conf/wrapper.conf.in /opt/foss/conf/wrapper.conf
四.目录结构
foss
├── bin
│ ├── app.sh
│ ├── app.shconf
│ └── wrapper
├── conf
│ └── wrapper.conf
├── lib
│ ├── libwrapper.so
│ ├── app-1.0.0.jar
│ └── wrapper.jar
└── logs
└── wrapper.log
五.修正配置
1、修正bin/app.sh配置
APP_NAME="foss"
APP_LONG_NAME="My Foss Application"
2、修正bin/app.shconf配置
APP_NAME="foss"
APP_LONG_NAME="My Foss Application"
注:app.shconf不是必要,如果有该文件,则会优先使用该文件中的配置,如果没有则会使用app.sh中的配置(所以为了简单可以不要该文件,直接修改app.sh中的配置项)。
3、修正conf/wrapper.conf配置
# 配置java的完整路径
wrapper.java.command=java
# 启动方式有WrapperSimpleApp,WrapperStartStopApp,WrapperListener,WrapperJarApp四种
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
# 添加自己应用的jar包
wrapper.java.classpath.2=../lib/app-1.0.0.jar
# Spring-Boot项目添加启动环境参数
wrapper.java.additional.1=-Dspring.profiles.active=local
# 是Spring-Boot项目时才配置(如果是其它可执行jar包,则不用配置)
wrapper.app.parameter.1=org.springframework.boot.loader.JarLauncher
# 以下三项是用户配置注册服务时使用
wrapper.name=foss
wrapper.displayname=foss
wrapper.description="Foss Application"
六.测试和启动项目
1、控制台运行
/opt/foss/bin/app.sh console
2、注册和删除服务
/opt/foss/bin/app.sh install
/opt/foss/bin/app.sh remove
2、启动和停止服务
/opt/foss/bin/app.sh start
/opt/foss/bin/app.sh stop
七.Java Service Wrapper包装服务的四种方式
1、WrapperSimpleApp
该方式就是上文的配置方法,没有代码侵入性,并且运行jar包也可以不用是可执行的jar包,配置如下
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=../lib/app-1.0.0.jar
wrapper.app.parameter.1=com.redtide.Boot/main
注:启动类后面不跟执行方法时,默认使用main方法
2、WrapperStartStopApp
该方式暂时还未使用,后续使用测试后再更新
3、WrapperListener
该方式需要程序中实现WrapperListener接口,对代码有侵入性,配置如下
wrapper.java.mainclass=com.redtide.Event
wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=../lib/app-1.0.0.jar
注:Event.java的代码如下
package com.redtide;
import org.tanukisoftware.wrapper.WrapperListener;
import org.tanukisoftware.wrapper.WrapperManager;
public class Event implements WrapperListener{
private MyApp myApp;
private Event(){
}
public static void main(String[] args){
WrapperManager.start(new Event(),args);
}
@Override
public Integer start(String[] args){
System.out.println("Event.start");
for(String str : args){
System.out.println("start==========" + str);
}
myApp = new MyApp(args);
myApp.start();
return null;
}
@Override
public int stop(int exitCode){
System.out.println("Event.stop = " + exitCode);
myApp.stop();
return exitCode;
}
@Override
public void controlEvent(int event){
System.out.println("Event.controlEvent = " + event);
if((event == WrapperManager.WRAPPER_CTRL_LOGOFF_EVENT) && (WrapperManager.isLaunchedAsService() || WrapperManager.isIgnoreUserLogoffs())){
// Ignore
}else{
WrapperManager.stop(0);
}
}
}
注:MyApp.java的代码如下
package com.redtide;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class MyApp{
public MyApp(String[] args){
System.out.println("MyApp.MyApp");
for(String str : args){
System.out.println("MyApp==========" + str);
}
}
public void start(){
System.out.println("MyApp.start");
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
Executors.newScheduledThreadPool(10).scheduleAtFixedRate(()->{
System.out.println(LocalDateTime.now().format(df));
},3,5,TimeUnit.SECONDS);
}
public void stop(){
System.out.println("MyApp.stop");
}
}
4、WrapperJarApp
该方法可以直接运行可执行的jar包,方便处理Spring-Boot之类的项目,配置如下
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperJarApp
wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.additional.1=-Dspring.profiles.active=local
wrapper.app.parameter.1=../lib/app-1.0.0.jar
注:wrapper.app.parameter.1后面直接跟可执行的jar包的相对路径,classpath后面则不需要再添加该jar包路径