深入探讨Maven打包:打造精致的Zip包

开发 前端
当我们执行 mvn package 命令进行打包时,Maven 会按照配置文件 package.xml 和插件的配置来生成最终的分发包。Maven Assembly Plugin 会根据配置文件定义的规则将项目的相关文件、依赖库等内容打包成指定的格式,并完成最终的分发包构建。

在部署Spring Boot生产项目时,首先需要使用Maven将其打包成一个JAR文件或者包含JAR文件的ZIP文件。随后,通过堡垒机将打包好的文件上传至服务器进行部署,或构建成Docker镜像进行发布。在这一过程中,我们需要将项目中的配置文件或静态资源放置在JAR包之外,这样在修改配置文件或静态资源时就无需重新打包。为了构建ZIP文件,我们使用了Maven Assembly Plugin插件,该插件用于创建项目分发包,通过一个XML描述文件定义打包内容。本文将详细介绍这一流程。

maven-assembly-plugin简介

maven-assembly-plugin 是一个 Maven 插件,用于创建项目分发包。该插件可以帮助将项目的构建输出、依赖库等资源打包成一个归档文件,如 JAR、ZIP、TAR 等,方便项目的部署和发布。

以下是 maven-assembly-plugin 的一些主要特点和用途:

  • 灵活的配置:通过配置插件,可以定义不同的打包方式和内容,满足各种项目的需求。可以选择包含依赖库、特定文件、目录结构等。
  • 多种打包格式:支持生成不同格式的归档文件,如 JAR 包含所有依赖、ZIP 压缩文件、TAR 文件等,可以根据实际情况选择合适的打包格式。
  • 自定义描述符:除了预定义的描述符外,还可以编写自定义描述符文件,以更精细的方式控制打包过程,定义需要包含的文件、目录结构等。
  • 插件执行阶段:通常在 Maven 构建的某个阶段(如 package 阶段)触发执行,生成所需的分发包。
  • 简化部署流程:打包成归档文件后,可以方便地进行部署和发布,简化了项目的交付流程。

maven-assembly-plugin 配置

让我们来看一下 Maven Assembly Plugin 的配置文件 package.xml,这个文件定义了项目打包的内容和形式。在这个 XML 文件中,我们定义了项目打包的格式为 zip 和 dir,同时指定了一些文件和目录的打包规则。

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">
 <!--项目打包统一文件 -->
 <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 中,我们还可以定义需要打包的依赖库、启动脚本文件、静态资源文件以及启动 jar 文件等内容。也可以在通过来排除一些我们不需要的资源, 通过这个 XML 文件,我们可以灵活地配置项目打包的内容和结构。

Maven Build 配置

在项目的POM文件中,我们还需要引入maven-assembly-plugin插件,并指定其配置文件。由于我们需要将配置文件和静态资源放置在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 这几个插件,并对它们进行了相应的配置。

总结

当我们执行 mvn package 命令进行打包时,Maven 会按照配置文件 package.xml 和插件的配置来生成最终的分发包。Maven Assembly Plugin 会根据配置文件定义的规则将项目的相关文件、依赖库等内容打包成指定的格式,并完成最终的分发包构建。

通过以上的配置和打包过程,我们可以很方便地使用 Maven 来管理项目的打包和发布,而不需要手动进行复杂的文件拷贝和整理工作。

责任编辑:武晓燕 来源: 修己xj
相关推荐

2009-12-23 16:13:00

WPF Attache

2010-03-31 14:58:03

云计算

2010-07-21 09:38:15

PHP缓存技术

2010-11-22 14:18:32

MySQL锁机制

2009-12-07 16:07:03

PHP类的继承

2021-05-17 05:36:02

CSS 文字动画技巧

2009-11-20 17:17:08

Oracle函数索引

2009-10-16 18:20:07

综合布线系统

2023-10-23 12:35:36

Golang追加操作

2009-12-01 16:34:21

PHP表单

2011-02-25 09:23:00

Java类加载器

2010-03-05 13:44:00

Python序列

2009-08-27 11:27:58

foreach语句C# foreach语

2015-09-02 08:57:56

JavaHashMap工作原理

2023-01-12 17:18:06

数据库多云

2024-01-26 06:42:05

Redis数据结构

2012-02-28 14:43:43

2013-07-11 09:45:48

扁平化扁平化设计

2017-01-03 17:57:46

Android异步精髓Handler

2009-12-11 11:08:31

静态路由策略
点赞
收藏

51CTO技术栈公众号