Spring Boot 多種生產打包方式詳解
生產上發(fā)布 Spring Boot 項目時,流程頗為繁瑣且低效。但凡代碼有一丁點改動,就得把整個項目重新打包部署,耗時費力不說,生成的 JAR 包還特別臃腫,體積龐大。每次更新項目,光是上傳這大文件就得花費不少時間,嚴重影響工作節(jié)奏。
為解決這一痛點,我打算把依賴庫以及配置文件(lib 文件夾下的那些 jar 包,還有config下的applacation.yml等文件)從項目主體里剝離出來,后續(xù)部署時,只需發(fā)布核心代碼就行,這樣既能加快部署速度,又能減輕文件傳輸負擔,讓項目更新變得輕松便捷
方法一:插件spring-boot-maven-plugin
(1) 項目應用的配置文件排除 統(tǒng)一打包到config目錄下
利用springboot中resource插件來排除配置,并統(tǒng)一打包到config目錄下:
<resources>
<resource>
<directory>src/main/resources</directory>
<!--filerting設置為true,則打包過程中會對這些文件進行過濾處理-->
<filtering>true</filtering>
<!--指定目標路徑為config-->
<targetPath>${project.build.directory}/config</targetPath>
<includes>
<!--使用通配符-->
<include>**/*.properties</include>
<include>**/*.yml</include>
<include>**/*.xml</include>
<include>mapper/*.xml</include>
<!-- 這里可以根據你實際想要包含的配置文件類型來添加更多的include配置 -->
</includes>
</resource>
</resources>
(2) 把我們寫代碼打包可執(zhí)行jar,并排除依賴jar包
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--項目的啟動類,如果有多個main就必須指定,沒有可以缺失
<mainClass>XXXXX.TwinWebApplication</mainClass>-->
<!--解決windows命令行窗口中文亂碼-->
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
<layout>ZIP</layout>
<!--配置需要打包進項目的jar-->
<includes>
<!--填寫需要打包所需要的依賴 。沒有匹配上任何jar包機排除依賴-->
<include>
<groupId>no-exists-jar</groupId>
<artifactId>non-exists-jar</artifactId>
</include>
</includes>
</configuration>
<executions>
<execution>
<goals>
<!-- 表示當運行mavn package打包時,使用Springboot插件打包 -->
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
(3) 配置依賴的jar包 統(tǒng)一打包lib目錄
<!--此插件用于將依賴包抽出-->
<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>
<excludeTransitive>false</excludeTransitive>
<stripVersion>false</stripVersion>
<includeScope>runtime</includeScope>
</configuration>
</execution>
</executions>
</plugin>
打包后目錄結構,如下圖所示:
執(zhí)行命令 java -jar -Dloader.path=./lib -jar xxx.jar
注意 springboot啟動時候會優(yōu)先讀取config目錄下配置文件 所以這里不用指定-Dspring.config.locatinotallow=XX.yml文件
注意 例如日志文件配置以及mybits等配置文件 可以配成絕對路徑 如下所示:
方法二 使用maven-jar-plugin插件實現(xiàn)
(1) 使用插件maven-resources-plugin處理配置文件打包到config目錄
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<!--配置文件打包成config目錄下 -->
<outputDirectory>${project.build.directory}/twin-web/config</outputDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
(2) 使用maven-jar-plugin 打包可執(zhí)行jar 并排除依賴
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<outputDirectory>
<!--輸入打包可執(zhí)行的jar到twin-web\libs\下-->
${project.build.directory}/twin-web/
</outputDirectory>
<archive>
<addMavenDescriptor>false</addMavenDescriptor>
<manifest>
<addClasspath>true</addClasspath>
<!-- 增加執(zhí)行啟動jar的依賴jar包目錄前綴-->
<classpathPrefix>./libs/</classpathPrefix>
<!-- 指定啟動類-->
<mainClass>com.keqing.twinweb.TwinWebApplication</mainClass>
</manifest>
<manifestEntries>
<!-- 增加配置文件的classpath-->
<Class-Path>./config/</Class-Path>
</manifestEntries>
</archive>
<!-- 排除配置文件-->
<excludes>
<exclude>*.yml</exclude>
<exclude>mapper/**</exclude>
<exclude>*.xml</exclude>
</excludes>
</configuration>
</plugin>
(3) 使用maven-dependency-plugin 打包libs目錄下
<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}/twin-web/libs</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>false</stripVersion>
<includeScope>runtime</includeScope>
</configuration>
</execution>
</executions>
</plugin>
使用package打包后的目錄
查看自己打包后jar目錄,注意這種打包方式弊端,按照一定約定格式規(guī)范固定了,一旦依賴jar包(包括配置文件目錄等)發(fā)生變化就必須重新打包
啟動程序java -jar xxx.jar
方式三 使用maven-assembly-plugin打包
maven-assembly-plugin 是 Maven 中的一個插件,它允許用戶將項目的輸出以及依賴、模塊、站點文檔和其他文件打包成一個可發(fā)布的格式,例如 zip、tar.gz、jar 等。以下是使用 maven-assembly-plugin 的一些優(yōu)勢:
- 自定義打包格式: maven-assembly-plugin 允許你通過定義描述符文件(descriptor)來完全自定義打包的內容和格式。你可以選擇包含或排除特定的文件和目錄。
- 一鍵打包: 通過一個簡單的 Maven 命令,你可以創(chuàng)建一個包含所有必需依賴的單一歸檔文件,這使得分發(fā)和部署變得非常簡單。
- 多環(huán)境支持: 可以為不同的環(huán)境(開發(fā)、測試、生產)創(chuàng)建不同的打包配置,使得環(huán)境遷移更加容易。
- 依賴管理: 插件會自動處理項目依賴,將它們打包到最終的歸檔文件中,無需手動管理。
- 模塊化項目支持: 對于多模塊項目,maven-assembly-plugin 可以將所有模塊的輸出合并到一個歸檔文件中。
- 預配置的描述符: 插件提供了一些預定義的描述符,如 bin、jar-with-dependencies 等,可以直接使用,無需自定義。
- 靈活性: 你可以通過修改描述符文件來調整打包行為,以適應不同的需求。
- 集成性: maven-assembly-plugin 與 Maven 生態(tài)系統(tǒng)緊密集成,可以與其他 Maven 插件協(xié)同工作。
- 文檔和社區(qū)支持: 由于 maven-assembly-plugin 是 Maven 的一部分,因此有廣泛的文檔和社區(qū)支持。
(1) 項目應用的配置文件排除
<resources>
<resource>
<directory>src/main/resources</directory>
<!--filerting設置為true,則打包過程中會對這些文件進行過濾處理-->
<filtering>true</filtering>
<includes>
<!--使用通配符-->
<include>**/*.properties</include>
<include>**/*.yml</include>
<include>**/*.xml</include>
<include>mapper/*.xml</include>
<!-- 這里可以根據你實際想要包含的配置文件類型來添加更多的include配置 -->
</includes>
</resource>
</resources>
(2) 配置spring-boot-maven-plugin
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--項目的啟動類,如果有多個main就必須指定,沒有可以缺失
<mainClass>XXXXX.TwinWebApplication</mainClass>-->
<!--解決windows命令行窗口中文亂碼-->
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
<layout>ZIP</layout>
<!--配置需要打包進項目的jar-->
<includes>
<!--填寫需要打包所需要的依賴 。沒有匹配上任何jar包機排除依賴-->
<include>
<groupId>no-exists-jar</groupId>
<artifactId>non-exists-jar</artifactId>
</include>
</includes>
</configuration>
<executions>
<execution>
<goals>
<!-- 表示當運行mavn package打包時,使用Springboot插件打包 -->
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
(3) 引入springboot里約定maven-assembly-plugin
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<!-- 打包文件名字不包含 assembly.xml 中 id -->
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<!--項目所在目錄配置文件的 assembly.xml文件 -->
<descriptor>assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
配置assembly.xml文件
<assembly>
<!-- 打包文件名的標識符,用來做后綴-->
<id>make-assembly</id>
<!-- 打包的類型,如果有N個,將會打N個類型的包 -->
<formats>
<format>tar.gz</format>
<format>zip</format>
</formats>
<!-- 壓縮包下是否生成和項目名相同的根目錄 -->
<includeBaseDirectory>true</includeBaseDirectory>
<!-- 用來設置一組文件在打包時的屬性。-->
<fileSets>
<!-- 0755->即用戶具有讀/寫/執(zhí)行權限,組用戶和其它用戶具有讀寫權限;-->
<!-- 0644->即用戶具有讀寫權限,組用戶和其它用戶具有只讀權限;-->
<!-- 將src/bin目錄下的jar啟動腳本輸出到打包后的目錄中 -->
<fileSet>
<!--lineEnding選項可用于控制給定的行結束文件 -->
<lineEnding>unix</lineEnding>
<directory>${basedir}/bin</directory>
<outputDirectory>${file.separator}</outputDirectory>
<fileMode>0755</fileMode>
<includes>
<include>**.sh</include>
<include>**.bat</include>
</includes>
</fileSet>
<!-- 把項目的配置文件,打包進壓縮文件的config目錄 -->
<fileSet>
<directory>${basedir}/src/main/resources</directory>
<outputDirectory>config</outputDirectory>
<fileMode>0644</fileMode>
<includes>
<include>*.properties</include>
<include>*.yml</include>
<include>*.xml</include>
<include>mapper/*.xml</include>
</includes>
</fileSet>
<!-- 把項目自己編譯出來的jar文件,打包進zip文件的根目錄 -->
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory>${file.separator}</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
<!-- 依賴包的拷貝-->
<dependencySets>
<dependencySet>
<unpack>false</unpack>
<useProjectArtifact>true</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
<scope>provided</scope>
</dependencySet>
<dependencySet>
<unpack>false</unpack>
<useProjectArtifact>true</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
<scope>system</scope>
</dependencySet>
<dependencySet>
<unpack>false</unpack>
<useProjectArtifact>true</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
</assembly>
打包后目錄:
解壓zip目錄查看:
使用命令啟動項目java -jar -Dloader.path=./lib -jar xxx.jar