SpringBoot 配置檔案與依賴庫分離打包配置
一、應用場景
一般情況下我們對springboot應用打包時使用springboot的maven外掛spring-boot-maven-plugin的maven進行打包,打包完成得到一個fatjar,fatjar的優點是可以直接執行,缺點是體積太大,不利於傳輸,springboot應用打出來的fatjar體積少則幾十M,多則上百M,在往伺服器部署傳輸時十分便,可能只改了某個類檔案,都需要重新將整個fatjar重新傳輸一次,特別是走公網傳輸的時候,可能上傳速度只有幾百甚至幾十KB,而整個fatjar中真正我們專案的程式碼檔案可能也就幾百KB或幾兆的大小,所以有必要將fatjar中的依賴庫與我們專案的class進行分離打包,這樣每次更換專案class就方便很多,而將配置檔案也分離出來的原因在於我們可能經常需要更改配置檔案的內容,如果放在fatjar中這樣修改是非常不方便的,所以也需要將配置檔案也分離出來。
> fatjar 即將專案需要的所有依賴庫及配置檔案等打進一個jar或war,該檔案可直接執行
二、配置
2.1 POM配置
下面對pom.xml進行配置,來實現分離打包,配置如下
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>chenyb</groupId> <artifactId>demo</artifactId> <version>v1.2-release</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.6.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <build> <plugins> <!-- springboot 打包外掛 --> <!-- <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>com.xx.xx</mainClass> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> --> <!-- maven 打包外掛 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <!-- MANIFEST.MF 中 Class-Path 加入字首 --> <classpathPrefix>lib/</classpathPrefix> <!-- jar包不包含唯一版本標識 --> <useUniqueVersions>false</useUniqueVersions> <!-- 指定入口類 --> <mainClass>cn.test.DemoApplication</mainClass> </manifest> </archive> <outputDirectory>${project.build.directory}</outputDirectory> </configuration> </plugin> <!-- 拷貝依賴 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> <overWriteReleases>true</overWriteReleases> <overWriteSnapshots>true</overWriteSnapshots> <overWriteIfNewer>true</overWriteIfNewer> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
關鍵配置說明:
(1) 去掉了spring-boot-maven-plugin打包外掛
(2) 新增 maven-jar-plugin (maven標準打包外掛)
(3) maven-dependency-plugin(依賴拷貝外掛,主要用於將maven依賴庫拷貝出來)
外掛具體的配置,pom.xml中已新增備註說明
2.2 打包
執行maven package 命令進行打包,得到的結果如下
將 lib目錄 及 專案jar 檔案拷貝到同一目錄下,我為了測試方便,先全部拷貝到桌面上,(放置伺服器上時也需保證在同一目錄下)
開啟demo-v1.2-release可以看到,並沒有將依賴jar打進來,大小隻有不到4KB
2.3 config目錄建立
以上做完還還需要將專案配置檔案拷貝出來,在與jar包平級目錄建立config目錄,將專案中的application.properties或yaml檔案拷貝進來
config 下的檔案
經過以上步驟,全部配置完畢,下面進行一下簡單的測試
三、測試
為了保證載入的是外部config目錄的配置檔案,我將application-test.yaml中的server.port改為8085, 開啟命令列輸入
C:\Users\Administrator\Desktop>java -jar -Dspring.profiles.active=dev -Dspring.location.config=config/ C:\Users\Administrator\Desktop\demo-v1.2-release.jar
回車執行,能正常啟動說明外部依賴可以正常載入進來
可以看到啟動完成後tomcat監聽埠為8085,說明外部配置載入成功。
PS : 如果外部配置檔案載入失敗,會使用專案jar中的配置檔案,如下圖,也就是啟動後會是8080埠
application-dev.yaml中配置的埠是8080
而我已將外部config目錄下application-dev.yaml中埠做了修改,使用外部配置檔案啟動後會是8085埠
四、一點小坑
預設情況下window命令列開啟後,是在當前使用者目錄下,像這樣
而我的config、lib、專案jar拷貝在桌面上,實際路徑是
一開始我在 C:\Users\Administrator> 直接執行下方命令,一直載入不到配置檔案
java -jar -Dspring.profiles.active=dev -Dspring.location.config=config/ C:\Users\Administrator\Desktop\demo-v1.2-release.jar
原因就在於程式與配置檔案不在同一目錄下,我在C:\Users\Administrator>執行啟動命令,而程式實際目錄在 C:\Users\Administrator\Desktop> 下,因為程式使用了絕對路徑,可以找到檔案,所以程式的實際執行路徑為C:\Users\Administrator\Desktop,而我使用的配置 spring.location.config=config/ 使用的是相對路徑,,這個相對路徑又是相對 C:\Users\Administrator> 目錄,所以就會出現找不到配置檔案的情況。
解決辦法一:
命令列切換到 C:\Users\Administrator\Desktop 目錄,即專案jar所在目錄,執行 java -jar 命令
解決辦法二:
將config拷貝到C:/Users/Administrator下,保證C:/Users/Administrator相對路徑下存在config目錄及配置檔案(該方法可解決問題,但是不建議)
解決方法三:
spring.location.config=config/ 處使用絕對路徑,即C:/Users/Administrator/Desktop/config/
所以很重要一點,一定保證 執行命令 的目錄 與專案jar、lib、config都在同一目錄下。
五、完整demo地址
https://github.com/yuboon/java-examples/tree/master/springboot-package-segment
&n