背景
spring boot工程,打包成zip发布,zip包内有bin、lib、config目录。bin目录为启动和停止应用脚本,config为工程依赖配置文件。
需求
1、本工程的jar包中,不包含config文件,将配置文件移到config中。
2、bin中的启动脚本顺利启动应用。
解决方案
1、针对工程jar包不能包含config文件
我们使用maven-jar-plugin插件中的excludes标签来解决。注意:excludes是从编译结果classes目录开始算目录结构,不是src下面。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
<configuration>
<archive>
<manifest>
<!-- 工程主入口 -->
<mainClass>com.jd.eptid.order.compare.CompareApplication</mainClass>
<addClasspath>true</addClasspath>
<!-- 此处如果设置,会在Manifest.MF文件中的引入jar包前加上此前缀,此处我注释掉了,否则可运行jar要放在lib同级目录而不是lib里面 -->
<!-- <classpathPrefix>lib/</classpathPrefix> -->
</manifest>
<manifestEntries>
<Class-Path>./</Class-Path>
</manifestEntries>
</archive>
<!--去除jar包中的配置文件,在外部加载-->
<!--注意从编译结果classes目录开始算目录结构,不是src下面-->
<excludes>
<!--排除classes目录下文件-->
<exclude>/*.xml</exclude>
<exclude>/*.yaml</exclude>
<!--排除spring目录-->
<exclude>**/spring/</exclude>
<!--排除spring目录下所有文件-->
<!--<exclude>**/spring/*</exclude>-->
</excludes>
</configuration>
</plugin>
2、将配置文件移到config中
我们使用maven-assembly-plugin插件来解决,其中fileSets可以指定文件目录。
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2</version>
<configuration>
<descriptors>
<descriptor>src/main/assembly/package.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<assembly>
<id>package</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>src/main/bin</directory>
<outputDirectory>bin</outputDirectory>
</fileSet>
<fileSet>
<directory>src/main/resources</directory>
<outputDirectory>config</outputDirectory>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<outputDirectory>lib</outputDirectory>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
</assembly>
3、在bin中顺利启动应用
因为配置文件已经移到外部,因此启动时需要手动指定配置文件。此处我们使用-Xbootclasspath/a的方式来加载配置文件目录。
$JAVA_HOME/bin/java -Xbootclasspath/a:$config_path -jar xxx.jar
延伸
使用Bootstrap Classloader来加载这些类。
-Xbootclasspath:完全取代系统Java classpath.最好不用。
-Xbootclasspath/a: 在系统class加载后加载。一般用这个。
-Xbootclasspath/p: 在系统class加载前加载,注意使用,和系统类冲突就不好了
win32 java -Xbootclasspath/a:some.jar;some2.jar; -jar test.jar
unix java -Xbootclasspath/a:some.jar:some2.jar: -jar test.jar
win32系统每个jar用分号隔开,unix系统下用冒号隔开。
例如:
java -Xmx1024m -Xbootclasspath/a:D:\target\config -Dfile.encoding=UTF-8 -jar D:\target\test.jar
总结
1、maven-jar-plugin插件可针对本工程的jar包做处理。
2、maven-assembly-plugin插件可以打出很多类型的包,可随意自定义包内结构,功能强大。
3、外部加载配置文件,需要将配置文件路径放入classpath中,Xbootclasspath可以做到。
引用
1、两种方式启动jar包
2、配置文件加载方式
3、解释什么是classpath