Spring-Boot工程打包
結(jié)合maven相關(guān)插件,實(shí)現(xiàn)如下打包目標(biāo):
- 開(kāi)發(fā)代碼和依賴(lài)庫(kù)分離
- 配置文件分離
1. 目標(biāo)
- 開(kāi)發(fā)代碼和依賴(lài)庫(kù)分離
- 配置文件分離
2. 背景
Spring-Boot工程默認(rèn)采用spring-boot-maven-plugin
(springboot-maven-plugin)插件進(jìn)行打包悉抵。該插件會(huì)將開(kāi)發(fā)代碼谈为、依賴(lài)庫(kù)以及靜態(tài)文件全部打包至一個(gè)jar包中,官方稱(chēng)該jar包為fat jar
。
該jar包本質(zhì)是一個(gè)壓縮文件,可以通過(guò)解壓工具打開(kāi),其目錄結(jié)構(gòu)如下:
|-- BOOT-INF
| |-- classes 開(kāi)發(fā)的類(lèi)及配置文件等
| |-- classpath.idx
| `-- lib 依賴(lài)庫(kù)
|-- META-INF
| |-- MANIFEST.MF
| `-- maven
`-- org
`-- springframework
2.1. 優(yōu)缺點(diǎn)
采用默認(rèn)方式的優(yōu)點(diǎn)很明顯就是簡(jiǎn)單谤绳。
由于所有文件都在一個(gè)jar中占锯,在某些場(chǎng)景下也存在一些不足。首先就是由于包含依賴(lài)缩筛,該jar體積會(huì)較大消略,即使不再調(diào)整依賴(lài)每次上線(xiàn)也得重新將依賴(lài)推至生產(chǎn)服務(wù)器;另外瞎抛,由于配置文件包含在jar中艺演,對(duì)于運(yùn)維來(lái)說(shuō)不太友好。
3. 解決方法
結(jié)合使用如下maven插件:
- maven-jar-plugin
- maven-dependency-plugin
- maven-assembly-plugin
注:后文所有插件的配置均在pom.xml的build -> plugins
標(biāo)簽下
3.1. 工程目錄約定
假設(shè)工程目錄結(jié)構(gòu)如下:
|-- README.md
|-- pom.xml
|-- src
| `-- main
| |-- bin 保存啟停腳本
| |-- build 保存構(gòu)建配置(assembly插件配置)
| |-- java java代碼
| `-- resources 資源文件
| `-- config 配置文件目錄
`-- dist 最終打包產(chǎn)物輸出目錄(maven-assembly-plugin)
3.2. 插件配置
3.2.1. maven-jar-plugin配置
功能:將開(kāi)發(fā)的代碼打包為jar桐臊。同時(shí)將類(lèi)路徑添加前綴胎撤,因?yàn)楹罄m(xù)會(huì)將依賴(lài)位置會(huì)在此jar的同級(jí)的lib目錄中。
pom.xml配置maven-jar-plugin部分:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<!--啟動(dòng)類(lèi)-->
<mainClass>pengchen.demo.App</mainClass>
<!--添加類(lèi)路徑前綴断凶,因?yàn)樽罱K的依賴(lài)包會(huì)放在lib目錄下-->
<classpathPrefix>lib</classpathPrefix>
<addClasspath>true</addClasspath>
</manifest>
</archive>
<excludes>
<!--避免將配置文件打包到開(kāi)發(fā)代碼生成的jar中-->
<!--assembly會(huì)將config目錄打包到輸出物的根目錄下-->
<exclude>config/**</exclude>
</excludes>
</configuration>
</plugin>
3.2.2. maven-dependency-plugin配置
功能:將依賴(lài)包打包至lib目錄中伤提。
pom.xml配置maven-dependency-plugin部分:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!-- 將依賴(lài)放到target/lib目錄下 -->
<outputDirectory>target/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
3.2.3. maven-assembly-plugin配置
功能:將配置文件、啟動(dòng)腳本认烁、依賴(lài)包及開(kāi)發(fā)代碼的jar放到合適的位置并對(duì)開(kāi)發(fā)代碼生成的jar包按指定規(guī)則命名肿男,最終將所有文件添加到壓縮包。
pom.xml配置maven-assembly-plugin部分:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<descriptors>
<!--指定assembly配置文件位置-->
<descriptor>src/main/build/assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>bundle</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
assembly.xml配置(src/main/build/assembly.xml):
<assembly>
<id>bundle</id>
<formats>
<format>tar.gz</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<!-- 啟停腳本 -->
<fileSet>
<directory>${basedir}/src/main/bin</directory>
<includes>
<include>*.sh</include>
</includes>
<outputDirectory>${file.separator}bin</outputDirectory>
</fileSet>
<!-- 配置文件 -->
<fileSet>
<directory>${basedir}/target/classes/config</directory>
<outputDirectory>${file.separator}config</outputDirectory>
</fileSet>
<!-- 依賴(lài)庫(kù) -->
<fileSet>
<directory>${basedir}/target/lib</directory>
<includes>
<include>*.jar</include>
</includes>
<outputDirectory>lib</outputDirectory>
</fileSet>
<!-- 可執(zhí)行的jar -->
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>${project.artifactId}-${project.version}.jar</include>
</includes>
</fileSet>
</fileSets>
</assembly>
3.3. 打包步驟
mvn package
3.4. 輸出物說(shuō)明
在工程dist目錄下會(huì)生成一個(gè).tar.gz
文件却嗡,這便是我們最終的產(chǎn)出物舶沛。
解壓后目錄結(jié)構(gòu)如下:
|-- assembly-with-springboot-demo-1.0-SNAPSHOT.jar 開(kāi)發(fā)代碼生成的jar包
|-- bin 啟停腳本目錄
| `-- run.sh
|-- config 配置文件目錄
| `-- application.properties
`-- lib 依賴(lài)庫(kù)目錄
|-- jackson-annotations-2.11.4.jar
... 其他依賴(lài)包
3.4. 運(yùn)行
采用此種方式配置不影響IDE中原來(lái)的運(yùn)行方式。針對(duì)打包后代碼的運(yùn)行也是直接通過(guò)java -jar命令執(zhí)行稽穆。