使用Maven的assembly外掛實現自定義打包
一、背景
最近我們專案越來越多了,然後我就在想如何才能把基礎服務的打包方式統一起來,並且可以實現按照我們的要求來生成,通過研究,我們通過使用maven的assembly外掛完美的實現了該需求,爽爆了有木有。本文分享該外掛的配置以及微服務的統一打包方式。
二、配置步驟及其他事項
1.首先我們需要在pom.xml中配置maven的assembly外掛
1 <build> 2 <plugins> 3 <plugin> 4 <groupId>org.apache.maven.plugins</groupId> 5 <artifactId>maven-jar-plugin</artifactId> 6 <version>2.3.1</version> 7 <configuration> 8 <archive> 9 <manifest> 10 <!--執行jar包時執行的主類,要求類全名--> 11 <mainClass>com.hafiz.Runner</mainClass> 12 <!-- 是否指定專案classpath下的依賴 --> 13 <addClasspath>true</addClasspath> 14 <!-- 指定依賴的時候宣告字首 --> 15 <classpathPrefix>./</classpathPrefix> 16 </manifest> 17 </archive> 18 </configuration> 19 </plugin> 20 <plugin> 21 <groupId>org.apache.maven.plugins</groupId> 22 <artifactId>maven-assembly-plugin</artifactId> 23 <executions> 24 <execution><!-- 配置執行器 --> 25 <id>make-assembly</id> 26 <phase>package</phase><!-- 繫結到package生命週期階段上 --> 27 <goals> 28 <goal>single</goal><!-- 只執行一次 --> 29 </goals> 30 <configuration> 31 <finalName>${project.name}</finalName> 32 <descriptor>src/main/assembly/assembly.xml</descriptor><!--配置描述檔案路徑--> 33 </configuration> 34 </execution> 35 </executions> 36 </plugin> 37 </plugins> 38 </build>
2.接著我們在src/main/assembly檔案中配置assembly.xml檔案
1 <assembly> 2 <id></id> 3 <formats> 4 <format>tar.gz</format><!--打包的檔案格式,也可以有:war zip--> 5 </formats> 6 <!--tar.gz壓縮包下是否生成和專案名相同的根目錄--> 7 <includeBaseDirectory>true</includeBaseDirectory> 8 <dependencySets> 9 <dependencySet> 10 <!--是否把本專案新增到依賴資料夾下--> 11 <useProjectArtifact>true</useProjectArtifact> 12 <outputDirectory>lib</outputDirectory> 13 <!--將scope為runtime的依賴包打包--> 14 <scope>runtime</scope> 15 </dependencySet> 16 </dependencySets> 17 <fileSets> 18 <fileSet> 19 <directory>src/main/bin</directory> 20 <outputDirectory>/</outputDirectory> 21 </fileSet> 22 </fileSets> 23 </assembly>
其中,生成的lib資料夾下放該專案的所有依賴以及該服務jar包,src/main/bin資料夾下我們一般放start.sh和stop.sh兩個指令碼檔案用來開啟和關閉該服務,打包後直接放到根目錄下。生成的tar.gz檔案的名字為:maven-assembly-plugin外掛中配置的finalName-assembly.xml配置的id(若assembly中沒有指定id,則只有前半部分).
3.專案目錄結構
其中紅色方框內就是通過assembly外掛是生成的tar.gz檔案,解壓后里面的結構如下:
其中lib目錄下是本專案生成的可執行jar包以及它的所有依賴jar包。若assembly外掛中配置<useProjectArtifact>為false,則不會生成assembly-demo資料夾,直接就是lib資料夾以及兩個指令碼檔案。
4.打包方式思考
我們通過這種方式,每個微服務就是一個以服務名稱命名的tar.gz檔案,解壓后里面lib目錄下是該服務生成的可執行jar包以及它所有的依賴jar包,我們直接執行根目錄下start.sh和stop.sh兩個指令碼檔案來進行服務的開啟和關閉。風格統一,簡單明瞭!
三、總結
隨著微服務的越來越火,我們將服務進行細粒度拆分後,也需要很好的把服務的打包以及部署方式進行統一,這樣我們就可以走自動化釋出工具來進行統一服務的管理和部署,使得越來越方便。