深入探討Maven打包:打造精致的Zip包
在部署Spring Boot生產(chǎn)項目時,首先需要使用Maven將其打包成一個JAR文件或者包含JAR文件的ZIP文件。隨后,通過堡壘機將打包好的文件上傳至服務器進行部署,或構(gòu)建成Docker鏡像進行發(fā)布。在這一過程中,我們需要將項目中的配置文件或靜態(tài)資源放置在JAR包之外,這樣在修改配置文件或靜態(tài)資源時就無需重新打包。為了構(gòu)建ZIP文件,我們使用了Maven Assembly Plugin插件,該插件用于創(chuàng)建項目分發(fā)包,通過一個XML描述文件定義打包內(nèi)容。本文將詳細介紹這一流程。
maven-assembly-plugin簡介
maven-assembly-plugin 是一個 Maven 插件,用于創(chuàng)建項目分發(fā)包。該插件可以幫助將項目的構(gòu)建輸出、依賴庫等資源打包成一個歸檔文件,如 JAR、ZIP、TAR 等,方便項目的部署和發(fā)布。
以下是 maven-assembly-plugin 的一些主要特點和用途:
- 靈活的配置:通過配置插件,可以定義不同的打包方式和內(nèi)容,滿足各種項目的需求。可以選擇包含依賴庫、特定文件、目錄結(jié)構(gòu)等。
- 多種打包格式:支持生成不同格式的歸檔文件,如 JAR 包含所有依賴、ZIP 壓縮文件、TAR 文件等,可以根據(jù)實際情況選擇合適的打包格式。
- 自定義描述符:除了預定義的描述符外,還可以編寫自定義描述符文件,以更精細的方式控制打包過程,定義需要包含的文件、目錄結(jié)構(gòu)等。
- 插件執(zhí)行階段:通常在 Maven 構(gòu)建的某個階段(如 package 階段)觸發(fā)執(zhí)行,生成所需的分發(fā)包。
- 簡化部署流程:打包成歸檔文件后,可以方便地進行部署和發(fā)布,簡化了項目的交付流程。
maven-assembly-plugin 配置
讓我們來看一下 Maven Assembly Plugin 的配置文件 package.xml,這個文件定義了項目打包的內(nèi)容和形式。在這個 XML 文件中,我們定義了項目打包的格式為 zip 和 dir,同時指定了一些文件和目錄的打包規(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">
<!--項目打包統(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>
<!-- 啟動腳本文件打包 -->
<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>
<!-- 啟動jar文件打包 -->
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory>./</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</assembly>
在 package.xml 中,我們還可以定義需要打包的依賴庫、啟動腳本文件、靜態(tài)資源文件以及啟動 jar 文件等內(nèi)容。也可以在通過來排除一些我們不需要的資源, 通過這個 XML 文件,我們可以靈活地配置項目打包的內(nèi)容和結(jié)構(gòu)。
Maven Build 配置
在項目的POM文件中,我們還需要引入maven-assembly-plugin插件,并指定其配置文件。由于我們需要將配置文件和靜態(tài)資源放置在JAR包之外,因此在打包過程中需要排除這些文件。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 這幾個插件,并對它們進行了相應的配置。
總結(jié)
當我們執(zhí)行 mvn package 命令進行打包時,Maven 會按照配置文件 package.xml 和插件的配置來生成最終的分發(fā)包。Maven Assembly Plugin 會根據(jù)配置文件定義的規(guī)則將項目的相關(guān)文件、依賴庫等內(nèi)容打包成指定的格式,并完成最終的分發(fā)包構(gòu)建。
通過以上的配置和打包過程,我們可以很方便地使用 Maven 來管理項目的打包和發(fā)布,而不需要手動進行復雜的文件拷貝和整理工作。