appassembler-maven-plugin详解

一直很好奇开源软件的启动脚本是怎么写出来的,直到最近看到seata pox.xml 才了解到有个appassembler-maven-plugi插件非常简单。可以用过简单xml配置,就可以将项目打包并且生成多个平台的启动脚本,非常简单、实用,下面我全方位带大家去了如何去使用它。

介绍插件

根据官网介绍,这个插件主要用于生成启动 java 应用程序的脚本,能将项目依赖jar能够打包目录中,并且它们加入启动脚本类路径中。
支持平台

  • Unix-variants
  • Windows NT (Windows 9x is NOT supported)
  • Java Service Wrapper (JSW) 可以很方便得在各个平台(windows,linux,max os)管理Java进程,管理JVM,启动停止,开机启动,管理内存溢出的异常 标准版还可以发错误日志email,检测死锁。官方说明

主要命令:
appassembler:assemble 打包项目并且配置bin 启动脚本,可以理解为使用类似spring-boot-maven-plugin打包出来项目,可以通过java -jar 方式启动项目,但是不支持stop、satus、restart这些操作,比较原始。
appassembler:create-repository 创建一个 appassembler 存储库,就是将工程打成jar
appassembler:generate-daemons 生成基于 JSW 的守护进程包装器,大多数人都是使用这个,重点讲。

appassembler:assemble

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>appassembler-maven-plugin</artifactId>
<version>2.1.0</version>
<configuration>
<platforms>
<platform>unix</platform>
<platform>windows</platform>
</platforms>
<!--包的存放路劲-->
<assembleDirectory>${project.build.directory}/${project.name}</assembleDirectory>
<repositoryName>lib</repositoryName>
<!--启动脚本目录-->
<binFolder>bin</binFolder>
<!--配置文件路径-->
<configurationDirectory>conf</configurationDirectory>
<!--是否copy配置文件-->
<copyConfigurationDirectory>true</copyConfigurationDirectory>
<!--从哪里copy配置文件-->
<configurationSourceDirectory>src/main/resources</configurationSourceDirectory>
<includeConfigurationDirectoryInClasspath>true</includeConfigurationDirectoryInClasspath>
<!--flag 表示直接将jar放到lib 里面-->
<repositoryLayout>flat</repositoryLayout>
<encoding>UTF-8</encoding>
<logsDirectory>logs</logsDirectory>
<tempDirectory>tmp</tempDirectory>
<programs>
<program>
<mainClass>tk.shenyifeng.demo.DemoApplication</mainClass>
<id>demo</id>
<jvmSettings>
<extraArguments>
<extraArgument>-server</extraArgument>
<extraArgument>-Xms256M</extraArgument>
<extraArgument>-Xmx256M</extraArgument>
<extraArgument>-Xss512k</extraArgument>
<extraArgument>-Xloggc:@BASEDIR@/logs/demo_gc.log</extraArgument>
<extraArgument>-verbose:gc</extraArgument>
<extraArgument>-XX:+HeapDumpOnOutOfMemoryError</extraArgument>
<extraArgument>-XX:HeapDumpPath=@BASEDIR@/logs/java_heapdump.hprof</extraArgument>
</extraArguments>
</jvmSettings>
</program>
</programs>
</configuration>
</plugin>

运行命令 mvn package appassembler:assemble 就可以在target/工程名/下看见打包好的工程,进入bin 目录可以看见有unix、windows 两大平台的运行脚本,但是这个脚本只有启动工程,不支持stop、restart 。

appassembler:generate-daemons

这个才是最重要的命令,使用插件都是使用这个生成可以启动、停止的脚本,方便在多个平台部署。下面直接贴上xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>appassembler-maven-plugin</artifactId>
<version>2.1.0</version>
<configuration>
<platforms>
<platform>unix</platform>
<platform>windows</platform>
</platforms>
<!--包的存放路劲-->
<assembleDirectory>${project.build.directory}/${project.name}</assembleDirectory>
<repositoryName>lib</repositoryName>
<!--启动脚本目录-->
<binFolder>bin</binFolder>
<!--配置文件路径-->
<configurationDirectory>conf</configurationDirectory>
<!--是否copy配置文件-->
<copyConfigurationDirectory>true</copyConfigurationDirectory>
<!--从哪里copy配置文件-->
<configurationSourceDirectory>src/main/resources</configurationSourceDirectory>
<includeConfigurationDirectoryInClasspath>true</includeConfigurationDirectoryInClasspath>
<binFileExtensions>
<unix>.sh</unix>
<windows>.bat</windows>
</binFileExtensions>
<!--flag 表示直接将jar放到lib 里面-->
<repositoryLayout>flat</repositoryLayout>
<encoding>UTF-8</encoding>
<logsDirectory>logs</logsDirectory>
<tempDirectory>tmp</tempDirectory>
<daemons>
<daemon>
<id>demo</id>
<mainClass>tk.shenyifeng.demo.DemoApplication</mainClass>
<platforms>
<platform>jsw</platform>
</platforms>
可以通过generatorConfigurations 设置脚本平台
<generatorConfigurations>
<generatorConfiguration>
<generator>jsw</generator>
<includes>
<include>linux-x86-32</include>
<include>linux-x86-64</include>
<include>windows-x86-32</include>
<include>windows-x86-64</include>
</includes>
</generatorConfiguration>
</generatorConfigurations>
<jvmSettings>
<extraArguments>
<extraArgument>-server</extraArgument>
<extraArgument>-Xms256M</extraArgument>
<extraArgument>-Xmx256M</extraArgument>
<extraArgument>-Xss512k</extraArgument>
<extraArgument>-Xloggc:logs/demo_gc.log</extraArgument>
<extraArgument>-verbose:gc</extraArgument>
<extraArgument>-XX:+HeapDumpOnOutOfMemoryError</extraArgument>
<extraArgument>-XX:HeapDumpPath=logs/java_heapdump.hprof</extraArgument>
</extraArguments>
>
</jvmSettings>
</daemon>
</daemons>

<programs>
<program>
<mainClass>tk.shenyifeng.demo.DemoApplication</mainClass>
<id>demoApp</id>
</program>
</programs>
</configuration>
</plugin>

在命令行执行

mvn clean package appassembler:generate-daemons

打包的文件夹在参数 target 设置,如果没有默认值 ${project.build.directory}/generated-resources/appassembler , 所以生成文件假放在 target\generated-resources\appassembler\ 下。
注意在windows 下执行改脚本需要使用管理员,不然会出现

wrapper | OpenSCManager failed - 拒绝访问。 (0x5)

首先执行 ,安装服务

demo.bat install

安装成功,就可以使用 start 运行服务了

demo.bat start

注意这个插件和spring-boot-maven-plugin 不兼容,会出现无法找到主类异常,主要还是因为可执行的jar格式在BOOT-INF/classes中打包应用程序类。这意味着当可执行jar用作依赖项时,无法找到它们。遇到这种情况在打包是,去除spring-boot-maven-plugin 即可

项目已经放在GitHub,有兴趣自己去查看。