深入探討Maven打包:打造精致的Zip包
在部署Spring Boot生產(chǎn)項(xiàng)目時(shí),首先需要使用Maven將其打包成一個(gè)JAR文件或者包含JAR文件的ZIP文件。隨后,通過(guò)堡壘機(jī)將打包好的文件上傳至服務(wù)器進(jìn)行部署,或構(gòu)建成Docker鏡像進(jìn)行發(fā)布。在這一過(guò)程中,我們需要將項(xiàng)目中的配置文件或靜態(tài)資源放置在JAR包之外,這樣在修改配置文件或靜態(tài)資源時(shí)就無(wú)需重新打包。為了構(gòu)建ZIP文件,我們使用了Maven Assembly Plugin插件,該插件用于創(chuàng)建項(xiàng)目分發(fā)包,通過(guò)一個(gè)XML描述文件定義打包內(nèi)容。本文將詳細(xì)介紹這一流程。
maven-assembly-plugin簡(jiǎn)介
maven-assembly-plugin 是一個(gè) Maven 插件,用于創(chuàng)建項(xiàng)目分發(fā)包。該插件可以幫助將項(xiàng)目的構(gòu)建輸出、依賴庫(kù)等資源打包成一個(gè)歸檔文件,如 JAR、ZIP、TAR 等,方便項(xiàng)目的部署和發(fā)布。
以下是 maven-assembly-plugin 的一些主要特點(diǎn)和用途:
- 靈活的配置:通過(guò)配置插件,可以定義不同的打包方式和內(nèi)容,滿足各種項(xiàng)目的需求。可以選擇包含依賴庫(kù)、特定文件、目錄結(jié)構(gòu)等。
- 多種打包格式:支持生成不同格式的歸檔文件,如 JAR 包含所有依賴、ZIP 壓縮文件、TAR 文件等,可以根據(jù)實(shí)際情況選擇合適的打包格式。
- 自定義描述符:除了預(yù)定義的描述符外,還可以編寫自定義描述符文件,以更精細(xì)的方式控制打包過(guò)程,定義需要包含的文件、目錄結(jié)構(gòu)等。
- 插件執(zhí)行階段:通常在 Maven 構(gòu)建的某個(gè)階段(如 package 階段)觸發(fā)執(zhí)行,生成所需的分發(fā)包。
- 簡(jiǎn)化部署流程:打包成歸檔文件后,可以方便地進(jìn)行部署和發(fā)布,簡(jiǎn)化了項(xiàng)目的交付流程。
maven-assembly-plugin 配置
讓我們來(lái)看一下 Maven Assembly Plugin 的配置文件 package.xml,這個(gè)文件定義了項(xiàng)目打包的內(nèi)容和形式。在這個(gè) XML 文件中,我們定義了項(xiàng)目打包的格式為 zip 和 dir,同時(shí)指定了一些文件和目錄的打包規(guī)則。
package.xml
<?xml versinotallow="1.0" encoding="UTF-8"?>
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
<!--項(xiàng)目打包統(tǒng)一文件 -->
<id>package</id>
<formats>
<format>zip</format>
<format>dir</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>lib</outputDirectory>
<scope>runtime</scope>
<excludes>
<exclude>${groupId}:${artifactId}</exclude>
</excludes>
</dependencySet>
</dependencySets>
<fileSets>
<!-- 啟動(dòng)腳本文件打包 -->
<fileSet>
<directory>bin/</directory>
<outputDirectory>./</outputDirectory>
<includes>
<include>*.sh</include>
</includes>
<fileMode>0755</fileMode>
<lineEnding>unix</lineEnding>
</fileSet>
<!--資源文件打包 -->
<fileSet>
<directory>src/main/resources</directory>
<outputDirectory>./</outputDirectory>
</fileSet>
<!-- 啟動(dòng)jar文件打包 -->
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory>./</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</assembly>
在 package.xml 中,我們還可以定義需要打包的依賴庫(kù)、啟動(dòng)腳本文件、靜態(tài)資源文件以及啟動(dòng) jar 文件等內(nèi)容。也可以在通過(guò)來(lái)排除一些我們不需要的資源, 通過(guò)這個(gè) XML 文件,我們可以靈活地配置項(xiàng)目打包的內(nèi)容和結(jié)構(gòu)。
Maven Build 配置
在項(xiàng)目的POM文件中,我們還需要引入maven-assembly-plugin插件,并指定其配置文件。由于我們需要將配置文件和靜態(tài)資源放置在JAR包之外,因此在打包過(guò)程中需要排除這些文件。Maven的配置示例如下:
<build>
<!--<finalName>${project.artifactId}-${project.version}</finalName>-->
<sourceDirectory>src/main/java</sourceDirectory>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>*</exclude>
</excludes>
</resource>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<encoding>UTF-8</encoding>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>xls</nonFilteredFileExtension>
<nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
<nonFilteredFileExtension>csv</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<!-- 添加index則不從mainfest中讀取classpath,而是從Index.list中讀取
<index>true</index> -->
<manifest>
<mainClass>cn.xj.snowflake.SnowflakeApplication</mainClass>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<packageName>${project.artifactId}-${project.version}</packageName>
</manifest>
</archive>
<excludes>
<exclude>config/**</exclude>
<exclude>mapper/**</exclude>
<exclude>mybatis/**</exclude>
<exclude>static/**</exclude>
<exclude>templates/**</exclude>
<exclude>i18n/**</exclude>
<exclude>lib/**</exclude>
<exclude>vm/**</exclude>
<exclude>*.txt</exclude>
<exclude>*.xml</exclude>
<exclude>*.properties</exclude>
<exclude>*.yml</exclude>
<exclude>*.properties</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy</id>
<phase>compile</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
<includeScope>compile</includeScope>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>conf/package.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
在 Maven Build 的配置中,我們引入了 maven-resources-plugin、maven-jar-plugin、maven-dependency-plugin 和 maven-assembly-plugin 這幾個(gè)插件,并對(duì)它們進(jìn)行了相應(yīng)的配置。
總結(jié)
當(dāng)我們執(zhí)行 mvn package 命令進(jìn)行打包時(shí),Maven 會(huì)按照配置文件 package.xml 和插件的配置來(lái)生成最終的分發(fā)包。Maven Assembly Plugin 會(huì)根據(jù)配置文件定義的規(guī)則將項(xiàng)目的相關(guān)文件、依賴庫(kù)等內(nèi)容打包成指定的格式,并完成最終的分發(fā)包構(gòu)建。
通過(guò)以上的配置和打包過(guò)程,我們可以很方便地使用 Maven 來(lái)管理項(xiàng)目的打包和發(fā)布,而不需要手動(dòng)進(jìn)行復(fù)雜的文件拷貝和整理工作。