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

简介: 本文介绍了如何使用Maven将Spring Boot项目打包并部署。首先,利用Maven Assembly Plugin创建包含JAR的ZIP文件,以便于部署和修改配置文件。该插件允许自定义打包内容和格式。在`package.xml`中定义了打包格式、依赖、脚本和资源文件的规则。接着,在POM.xml中配置插件,排除配置文件和静态资源以保持外部。最后,执行`mvn package`命令生成分发包,简化了项目的部署流程。

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

6fe38d46bf0f4555b05931b6c27c5793_3.png

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 version="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 来管理项目的打包和发布,而不需要手动进行复杂的文件拷贝和整理工作。

目录
相关文章
|
14天前
|
Java Linux Apache
maven篇6:maven打包
maven篇6:maven打包
123 5
|
14天前
|
Java 测试技术 Maven
maven 打jar包:mvn clean package
maven 打jar包:mvn clean package
42 7
|
13天前
|
Java Maven
SpringBoot项目的用maven插件打包报Test错误
SpringBoot项目的用maven插件打包报Test错误
|
14天前
|
Java Maven
向 Maven 中央仓库上传一个修改过的基于jeecg的autoPOI的 jar包记录(一)
向 Maven 中央仓库上传一个修改过的基于jeecg的autoPOI的 jar包记录
22 0
|
3天前
|
Java Maven 开发工具
记录一次Maven无法打包的排查过程
【5月更文挑战第3天】记录一次WhatTheFuck经历
40 2
记录一次Maven无法打包的排查过程
|
5天前
|
Java Maven Spring
maven打包插件maven-jar-plugin与spring-boot-maven-plugin
该内容介绍了两个Maven打包插件:`spring-boot-maven-plugin`和`maven-jar-plugin`。`spring-boot-maven-plugin`是Spring Boot项目的默认打包工具,它会包含项目类文件、资源和依赖的jar,但不会解编译依赖。而`maven-jar-plugin`则用于创建普通JAR包,不包含依赖。文中还展示了两个插件打包后的效果差异,并强调了持续练习以掌握这些技能的重要性。
15 0
|
14天前
|
Java Go Maven
向 Maven 中央仓库上传一个修改过的基于jeecg的autoPOI的 jar包记录(二)
向 Maven 中央仓库上传一个修改过的基于jeecg的autoPOI的 jar包记录
16 0
|
14天前
|
安全 前端开发 Java
安全同学讲Maven重打包的故事
经过去年的Log4j-core的治理工作,我们通过Maven的依赖仲裁机制,在蚂蚁集团静态代码扫描平台-STC 和资产威胁透视-哈勃2款产品的联动合作下,很好的完成了直接依赖和间接依赖场景下的治理工作。但路还很远,新的场景层出不穷,故事还远远没有结束,我们要做的事情还非常多。
80 12
|
14天前
|
机器学习/深度学习 人工智能 运维
人工智能平台PAI产品使用合集之机器学习PAI中怎么拉到maven仓库的包
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
14天前
|
Java Maven
SpringMVC常用Maven POM.xml依赖包片段
SpringMVC常用Maven POM.xml依赖包片段

热门文章

最新文章

推荐镜像

更多