乐趣区

关于maven:appassemblermavenplugin详解

始终很好奇开源软件的启动脚本是怎么写进去的,直到最近看到 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

 <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

            <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,有趣味本人去查看。

退出移动版