使用Maven的assembly外掛實現自定義打包

阿豪聊乾貨發表於2017-03-12

一、背景

  最近我們專案越來越多了,然後我就在想如何才能把基礎服務的打包方式統一起來,並且可以實現按照我們的要求來生成,通過研究,我們通過使用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,則只有前半部分)].

assembly的具體語法,請參見官網http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html

這裡面涉及到如何生成可執行的jar包,具體參見:用Maven快速生成帶有依賴的可執行jar包

3.專案目錄結構

其中紅色方框內就是通過assembly外掛是生成的tar.gz檔案,解壓后里面的結構如下:

其中lib目錄下是本專案生成的可執行jar包以及它的所有依賴jar包。若assembly外掛中配置<useProjectArtifact>為false,則不會生成assembly-demo資料夾,直接就是lib資料夾以及兩個指令碼檔案。

程式碼Github地址:https://github.com/hafizzhang/assembly-demo.git

4.打包方式思考

我們通過這種方式,每個微服務就是一個以服務名稱命名的tar.gz檔案,解壓后里面lib目錄下是該服務生成的可執行jar包以及它所有的依賴jar包,我們直接執行根目錄下start.sh和stop.sh兩個指令碼檔案來進行服務的開啟和關閉。風格統一,簡單明瞭!

三、總結

  隨著微服務的越來越火,我們將服務進行細粒度拆分後,也需要很好的把服務的打包以及部署方式進行統一,這樣我們就可以走自動化釋出工具來進行統一服務的管理和部署,使得越來越方便

相關文章