疑问:Spring Boot已经有了 spring-boot-maven-plugin
的打包方式,为什么还要自己重新实现打包方式呢?
答:都各有优势吧,不过本文的方式更加强大。不过SpringBoot打包出来jar文件,没办法进行修改,如果遇到需要简单修改一些系统配置或参数时(一些非配置中心的参数,如日志配置文件中的某个系统参数等),那就必须要重新编译打包才能生效。同时,本文的方式会自动生成各种操作系统(MAC/AIX/Linux/Windows等)的脚本文件,以及一些相关的运维命令(console|start|stop|restart|status|dump),同时可以依赖版本检查、GIT历史记录、远程DEBUG、配置JVM参数、GC参数和JMX参数等。
1 背景
每个JAVA项目开发完成后都会考虑部署至各个环境(DEV、TEST、PRO等)中,选择一种好的打包方式,将会在使用中无形的减少不少工作量,同时也会带来很多方便之处。反之,没有选择好打包方式,则会带来诸多不变之处。 下面我将介绍几种JAVA工厂常见的打包方式,先上效果图:
2 spring-boot-maven-plugin
spring-boot-maven-plugin是Springboot提供的打包插件,直接在POM中添加一下Plugin即可:
org.springframework.boot
spring-boot-maven-plugin
cn.micro.demo.DemoApplication
3 自定义打包脚本
如果你的脚本编写能力很高,那完全可以考虑自己编写一套适合自己的打包脚本出来,不过因为难度和复杂度都较大所以不建议自己编写,等常用的方式解决不了你的需求时再考虑。
4 IDEA手动打包
常用的IDEA开发工具都是可以可视化界面打包部署包的,不过这种方式不利于CI/CD流程,所以也不推荐。
5 JSW+Assembly
JSW+Assembly是JAVA工程MAVEN通用打包方式。精简方式则直接使用:appassembler-maven-plugin和maven-assembly-plugin即可完成打包。但为了更好的效果,我将引入几个好用的插件来配合完成打包。
5.1 maven-compiler-plugin
maven-compiler-plugin插件主要用于指定编译时的JDK版本。
org.apache.maven.plugins
maven-compiler-plugin
3.7.0
1.8
5.2 maven-jar-plugin
maven-jar-plugin插件主要用于项目打包时,排除配置文件不打包进jar包中(如果配置打入了jar,则每次变更配置,都需要重新打包,很不方便)。
org.apache.maven.plugins
maven-jar-plugin
2.6
*.yml
*.xml
*.properties
static/**
*.conf
tools/**
package
jar
5.3 maven-enforcer-plugin
maven-enforcer-plugin插件主要用于打包时检测各种规范要求,如:检查JDK版本、MAVEN版本、不能依赖快照等功能。
org.apache.maven.plugins
maven-enforcer-plugin
3.0.0-M2
default-cli
enforce
validate
[3.3.3,)
[1.8.0,)
No Snapshots Allowed!
5.4 git-commit-id-plugin
git-commit-id-plugin用于将当前GIT项目的Commit日志记录打包成一个文件,便于查看当前物料包的历史GIT日志(如使用场景:线上跑的代码,想看看是否提交了某个BUG的修复记录)。
pl.project13.maven
git-commit-id-plugin
revision
true
yyyy-MM-dd'T'HH:mm:ssZ
true
${project.build.directory}/dist/jsw/app/conf/git.properties
5.5 appassembler-maven-plugin
appassembler-maven-plugin用于将当前项目打包成个性化的目录框架,并同时使用JSW(Java Service Wrapper)生成各种操作系统的运维脚本(启动、停止、查看状态、重启等等命令),并且赋予可执行的权限等操作。同时也可以指定JMX端口、远程DEBUG端口、GC配置、GC日志、JVM配置和内存溢出Dump等信息。
org.codehaus.mojo
appassembler-maven-plugin
2.0.0
UTF-8
bin
tmp
logs
lib
flat
${project.build.directory}/dist
conf
true
src/main/resources
app
cn.micro.demo.Main
jsw
jsw
aix-ppc-32
aix-ppc-64
linux-ppc-64
linux-x86-32
linux-x86-64
windows-x86-32
windows-x86-64
hpux-parisc-64
solaris-x86-32
solaris-sparc-32
solaris-sparc-64
macosx-ppc-32
macosx-universal-32
macosx-universal-64
configuration.directory.in.classpath.first
conf
wrapper.ping.timeout
120
set.default.REPO_DIR
lib
wrapper.logfile
logs/wrapper.log
java.security.policy=conf/policy.all
com.sun.management.jmxremote
com.sun.management.jmxremote.port=8777
com.sun.management.jmxremote.authenticate=false
com.sun.management.jmxremote.ssl=false
-server
-Xdebug
-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5010
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=logs/heap-dump.hprof
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:InitiatingHeapOccupancyPercent=45
-XX:G1ReservePercent=10
-XX:NewRatio=2
-XX:SurvivorRatio=8
-XX:MaxTenuringThreshold=15
-Xloggc:logs/gc.log
-XX:GCLogFileSize=10M
-XX:NumberOfGCLogFiles=10
-XX:+UseGCLogFileRotation
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-XX:+PrintHeapAtGC
-XX:+PrintGCApplicationStoppedTime
-XX:+DisableExplicitGC
-verbose:gc
generate-jsw-scripts
package
generate-daemons
5.6 maven-assembly-plugin
maven-assembly-plugin插件用于将上述appassembler-maven-plugin插件打包后的目录框架,再次打包为压缩包,便于在不同环境中进行拷贝操作。
org.apache.maven.plugins
maven-assembly-plugin
3.1.0
src/main/resources/tools/assembly.xml
make-assembly
package
single
完整Plugin如下:
src/main/resources
true
org.apache.maven.plugins
maven-compiler-plugin
3.7.0
${java.version}
org.apache.maven.plugins
maven-jar-plugin
2.6
*.yml
*.xml
*.properties
static/**
*.conf
tools/**
package
jar
org.apache.maven.plugins
maven-enforcer-plugin
3.0.0-M2
default-cli
enforce
validate
[${maven.version},)
[${java.version}.0,)
pl.project13.maven
git-commit-id-plugin
revision
true
yyyy-MM-dd'T'HH:mm:ssZ
true
${project.build.directory}/dist/jsw/app/conf/git.properties
org.codehaus.mojo
appassembler-maven-plugin
2.0.0
UTF-8
bin
tmp
logs
lib
flat
${project.build.directory}/dist
conf
true
src/main/resources
app
cn.micro.biz.Main
jsw
jsw
aix-ppc-32
aix-ppc-64
linux-ppc-64
linux-x86-32
linux-x86-64
windows-x86-32
windows-x86-64
hpux-parisc-64
solaris-x86-32
solaris-sparc-32
solaris-sparc-64
macosx-ppc-32
macosx-universal-32
macosx-universal-64
configuration.directory.in.classpath.first
conf
wrapper.ping.timeout
120
set.default.REPO_DIR
lib
wrapper.logfile
logs/wrapper.log
-server
-Xdebug
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=logs/heap-dump.hprof
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:InitiatingHeapOccupancyPercent=45
-XX:G1ReservePercent=10
-XX:NewRatio=2
-XX:SurvivorRatio=8
-XX:MaxTenuringThreshold=15
-Xloggc:logs/gc.log
-XX:GCLogFileSize=10M
-XX:NumberOfGCLogFiles=10
-XX:+UseGCLogFileRotation
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-XX:+PrintHeapAtGC
-XX:+PrintGCApplicationStoppedTime
-XX:+DisableExplicitGC
-verbose:gc
generate-jsw-scripts
package
generate-daemons
org.apache.maven.plugins
maven-assembly-plugin
3.1.0
src/main/resources/tools/assembly.xml
make-assembly
package
single
assembly.xml文件内容为:
dist
tar.gz
true
target/dist/jsw/app/bin
bin
0755
0755
target/dist/jsw/app/conf/tools
bin
0755
0755
**.sh
**.bat
target/dist/jsw/app/conf
conf
*.yml
*.xml
*.properties
static/**
*.conf
tools/**
0644
0744
target/dist/jsw/app/lib
lib
0644
0744
target/dist/jsw/app/logs
logs
0644
0744
target/dist/jsw/app/tmp
tmp
0644
0744
5.7 打包命令
mvn clean package appassembler:generate-daemons -Dmaven.test.skip=true
打包之后的目录结构为: