我在前文介紹瞭如何使用 assembly 對 Spring Boot 項目進行打包(點擊查看),打包後會發現項目的代碼和項目所有的依賴文件會一起打成一個可執行的 jar 包。
如果項目的依賴包很多,那麼這個文件就會非常大。每次發佈版本如果都要上傳這個整合的 jar 包,既浪費帶寬也浪費時間。下面演示如何將項目的外部依賴跟自己的代碼包分開打包,這樣當項目修改後,只需要上傳覆蓋修改後的包即可。
二、將項目與依賴分開打包
1.修改配置
(1)首先我們編輯 assembly.xml 配置文件,在前文的基礎上新增第三方依賴設置(高亮部分),實現將第三方的 jar 包添加到壓縮包裏的 lib 目錄:
<assembly>
<!--
必須寫,否則打包時會有 assembly ID must be present and non-empty 錯誤
這個名字最終會追加到打包的名字的末尾,如項目的名字爲 hangge-test-0.0.1-SNAPSHOT,
則最終生成的包名爲 hangge-test-0.0.1-SNAPSHOT-bin.tar.gz
-->
<id>bin</id>
<!-- 打包的類型,如果有N個,將會打N個類型的包 -->
<formats>
<format>tar.gz</format>
<!--<format>zip</format>-->
</formats>
<includeBaseDirectory>true</includeBaseDirectory>
<!--第三方依賴設置-->
<dependencySets>
<dependencySet>
<!-- 不使用項目的artifact,第三方jar不要解壓,打包進zip文件的lib目錄 -->
<useProjectArtifact>false</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
<unpack>false</unpack>
</dependencySet>
</dependencySets>
<!--文件設置-->
<fileSets>
<!--
0755->即用戶具有讀/寫/執行權限,組用戶和其它用戶具有讀寫權限;
0644->即用戶具有讀寫權限,組用戶和其它用戶具有隻讀權限;
-->
<!-- 將src/main/assembly/bin目錄下的所有文件輸出到打包後的bin目錄中 -->
<fileSet>
<directory>src/main/assembly/bin</directory>
<outputDirectory>bin</outputDirectory>
<fileMode>0755</fileMode>
<!--如果是腳本,一定要改爲unix.如果是在windows上面編碼,會出現dos編寫問題-->
<lineEnding>unix</lineEnding>
<filtered>true</filtered><!-- 是否進行屬性替換 -->
</fileSet>
<!-- 將src/main/assembly/config目錄下的所有文件輸出到打包後的config目錄中 -->
<fileSet>
<directory>src/main/assembly/config</directory>
<outputDirectory>config</outputDirectory>
<fileMode>0644</fileMode>
</fileSet>
<!-- 將src/main/resources下配置文件打包到config目錄 -->
<fileSet>
<directory>src/main/resources</directory>
<outputDirectory>/config</outputDirectory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
<include>**/*.yml</include>
</includes>
<filtered>true</filtered><!-- 是否進行屬性替換 -->
</fileSet>
<!-- 將項目啓動jar打包到lib目錄中 -->
<fileSet>
<directory>target</directory>
<outputDirectory>lib</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
<!-- 將項目說明文檔打包到docs目錄中 -->
<fileSet>
<directory>.</directory>
<outputDirectory>docs</outputDirectory>
<includes>
<include>*.md</include>
</includes>
<fileMode>0644</fileMode>
</fileSet>
<fileSet>
<directory>docs</directory>
<outputDirectory>docs</outputDirectory>
<fileMode>0644</fileMode>
</fileSet>
<fileSet>
<directory>src/main/assembly/docs</directory>
<outputDirectory>docs</outputDirectory>
<fileMode>0644</fileMode>
</fileSet>
</fileSets>
</assembly>
(2)接着編輯項目的 pom.xml 文件,先前使用的是 spring-boot-maven-plugin 來打包,這個插件會將項目所有的依賴打入項目 jar 包裏面。我們將其替換爲 maven-jar-plugin,並進行相關設置。
<build>
<plugins>
<!-- 指定啓動類,將依賴打成外部jar包 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<!-- 生成的jar中,不要包含pom.xml和pom.properties這兩個文件 -->
<addMavenDescriptor>false</addMavenDescriptor>
<manifest>
<!-- 是否要把第三方jar加入到類構建路徑 -->
<addClasspath>true</addClasspath>
<!-- 外部依賴jar包的最終位置 -->
<!-- 因爲我們將第三方jar和本項目jar放在同一個目錄下,這裏就使用./ -->
<classpathPrefix>./</classpathPrefix>
<!-- 項目啓動類 -->
<mainClass>com.example.hanggetest.HanggeTestApplication</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<!--主要使用的是maven提供的assembly插件完成-->
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<descriptors>
<!--具體的配置文件-->
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<!--綁定到maven操作類型上-->
<phase>package</phase>
<!--運行一次-->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
2.打包測試
上面兩個配置修改完畢後,我們重新對項目進行打包。將生成的壓縮包解壓後可以發現,lib 文件夾下項目 jar 包以及第三方 jar 都分開了,並且項目 jar 體積也十分小巧。