前言:
在springboot官方文档中貌似没找到,把依赖和配置文件打包出来的教学。不过却看到了有趣的东西。那就是spingboot加载配置文件的顺序,优先级由高到底,高优先级的配置会覆盖低优先级的配置;
–file:./config/
–file:./
–classpath:/config/
–classpath:/
所以当时想的第一种方法就是配置一下pom.xml打包的时候排除config下的所有配置文件,手动copy一个config文件夹在jar包旁边。这样通过命令行启动的时候呢就会springboot自动加载当前目录下的config,优先级高覆盖,完美解决的配置文件的问题。的确一开始我也是这样做的。后来翻了翻百度。发现原来公司里面还要分离jar包,目的是另外如果某个依赖jar有修改,则只需要替换依赖的jar并重启即可,不需要重新打包。所以这里就学习了一下,记录下来。
开始正片:
使用到的插件是:
maven-jar-plugin
maven-assembly-plugin
目录结构:
这里看到主要的需要分离的是config下的配置文件。所以下一步配置pom.xml
先配置打包jar包的插件
<!-- 打jar包的插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib</classpathPrefix>
<!-- 程序启动入口 -->
<mainClass>com.awakeyo.wangpengdemo.WangpengdemoApplication</mainClass>
</manifest>
<manifestEntries>
<Class-Path>./</Class-Path>
</manifestEntries>
</archive>
<excludes>
<exclude>config/**</exclude>
</excludes>
</configuration>
</plugin>
maven-jar-plugin的配置:
manifest的部分是核心,在可执行的jar文件中,打包后会在jar文件内的META-INF文件夹下,生成一个MANIFEST.MF文件,里面记录了可执行文件的一些相关配置,比如像上面一段代码中所配置的内容,这里面就配置了可执行jar文件未来读取classpath的相对目录位置在什么地方,以及引入的jar文件都有哪些
mainClass:哪个class作为程序的入口来执行
addClasspath:是否将依赖的classpath一起打包
classpathPrefix:依赖的classpath的前缀,也就是打包后生成的MANIFEST.MF文件里,引入的jar文件都会加上前缀,lib/,比如fastjson-1.2.7.jar,在mainfest文件里就会是lib/fastjson-1.2.7.jar
excludes:排除哪些文件夹不被打包进去
配置将jar包和外部配置等文件整体打包
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<!--jar包名称-->
<finalName>${project.artifactId}-${project.version}</finalName>
<!--描述文件路径-->
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-zip</id>
<!-- 绑定到package生命周期阶段上 -->
<phase>package</phase>
<goals>
<!-- 只运行一次 -->
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
配置assembly.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<assembly>
<!-- 可自定义,这里指定的是项目环境 -->
<!-- spring-boot-assembly-local-1.0.RELEASE.tar.gz -->
<id>${profileActive}-${project.version}</id>
<!-- 打包的类型,如果有N个,将会打N个类型的包 -->
<formats>
<!-- <format>tar.gz</format>-->
<format>zip</format>
</formats>
<includeBaseDirectory>true</includeBaseDirectory>
<fileSets>
<!--
0755->即用户具有读/写/执行权限,组用户和其它用户具有读写权限;
0644->即用户具有读写权限,组用户和其它用户具有只读权限;
-->
<!-- 将src/bin目录下的所有文件输出到打包后的bin目录中 -->
<fileSet>
<directory>${basedir}/src/bin</directory>
<outputDirectory>bin</outputDirectory>
<fileMode>0755</fileMode>
<includes>
<include>**.sh</include>
<include>**.bat</include>
</includes>
</fileSet>
<!-- 指定输出target/classes中的配置文件到config目录中 -->
<fileSet>
<directory>${basedir}/target/classes/config</directory>
<outputDirectory>config</outputDirectory>
<fileMode>0644</fileMode>
<includes>
<include>application.yml</include>
<include>application-${profileActive}.yml</include>
<!-- <include>mapper/**/*.xml</include>-->
<!-- <include>static/**</include>-->
<!-- <include>templates/**</include>-->
<!-- <include>*.xml</include>-->
<include>*.properties</include>
</includes>
</fileSet>
<!-- 将项目启动jar打包到boot目录中 -->
<fileSet>
<directory>${basedir}/target</directory>
<outputDirectory>/</outputDirectory>
<fileMode>0755</fileMode>
<includes>
<include>${project.build.finalName}.jar</include>
</includes>
</fileSet>
</fileSets>
<!-- 将第三方依赖打包到lib目录中 -->
<dependencySets>
<dependencySet>
<outputDirectory>lib</outputDirectory>
<scope>runtime</scope>
<!--<unpack>false</unpack> -->
<excludes>
<!--<exclude>${project.name}-${project.version}</exclude> -->
<exclude>${groupId}:${artifactId}</exclude>
</excludes>
</dependencySet>
</dependencySets>
<!-- 包含根目录下的文件 -->
<!-- <fileSet>-->
<!-- <directory>${basedir}</directory>-->
<!-- <includes>-->
<!-- <include>NOTICE</include>-->
<!-- <include>LICENSE</include>-->
<!-- <include>*.md</include>-->
<!-- </includes>-->
<!-- </fileSet>-->
</assembly>
最后打包即可,最终目录如图
写了个等于没写的shell脚本,进bin目下
./demostart.sh
即可启动springboot项目。
看到springboot输出就安心了。
语法主要参考于blog:
https://www.iteye.com/blog/blueram-1684070
http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html