前言:
在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