# Java Application Maven项目如何打自定义ZIP包 ## 目录 1. [前言](#前言) 2. [Maven打包基础](#maven打包基础) 3. [自定义ZIP包需求场景](#自定义zip包需求场景) 4. [使用Maven Assembly插件](#使用maven-assembly插件) 5. [使用Maven Shade插件](#使用maven-shade插件) 6. [使用Maven AntRun插件](#使用maven-antrun插件) 7. [高级自定义技巧](#高级自定义技巧) 8. [实战案例](#实战案例) 9. [常见问题与解决方案](#常见问题与解决方案) 10. [总结](#总结) ## 前言 在Java项目开发中,Maven作为主流的构建工具,其打包功能是项目交付的重要环节。标准的`mvn package`命令会生成JAR/WAR包,但在实际生产环境中,我们经常需要将应用程序、配置文件、依赖库等打包成ZIP格式进行分发。本文将全面讲解如何在Maven项目中实现自定义ZIP打包。 ## Maven打包基础 ### 标准打包流程 ```xml <project> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>my-app</artifactId> <version>1.0.0</version> <packaging>jar</packaging> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> </plugin> </plugins> </build> </project>
validate
- 验证项目compile
- 编译源代码test
- 运行测试package
- 打包编译后的代码verify
- 检查打包结果install
- 安装到本地仓库deploy
- 部署到远程仓库/my-app-1.0.0.zip ├── bin/ │ ├── startup.sh │ └── shutdown.sh ├── lib/ │ └── *.jar ├── conf/ │ └── application.properties └── docs/ └── README.md
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <configuration> <descriptors> <descriptor>src/assembly/zip.xml</descriptor> </descriptors> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
<!-- src/assembly/zip.xml --> <assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd"> <id>distribution</id> <formats> <format>zip</format> </formats> <fileSets> <!-- 添加可执行JAR --> <fileSet> <directory>${project.build.directory}</directory> <outputDirectory>/</outputDirectory> <includes> <include>*.jar</include> </includes> </fileSet> <!-- 添加配置文件 --> <fileSet> <directory>src/main/resources</directory> <outputDirectory>/conf</outputDirectory> <includes> <include>*.properties</include> <include>*.xml</include> </includes> </fileSet> </fileSets> <!-- 添加依赖库 --> <dependencySets> <dependencySet> <outputDirectory>/lib</outputDirectory> <scope>runtime</scope> </dependencySet> </dependencySets> </assembly>
<filters>
替换变量<fileSet> <directory>src/main/scripts</directory> <outputDirectory>/bin</outputDirectory> <fileMode>755</fileMode> </fileSet>
Shade插件主要用于uber-jar打包,但也可用于资源处理:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <outputFile>${project.build.directory}/dist/${project.artifactId}-${project.version}.jar</outputFile> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> </excludes> </filter> </filters> </configuration> </execution> </executions> </plugin>
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>1.8</version> <executions> <execution> <phase>package</phase> <goals> <goal>run</goal> </goals> <configuration> <target> <zip destfile="${project.build.directory}/custom-package.zip" basedir="${project.build.directory}" includes="*.jar, *.properties"/> </target> </configuration> </execution> </executions> </plugin>
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <executions> <execution> <id>generate-version-file</id> <phase>prepare-package</phase> <goals> <goal>exec</goal> </goals> <configuration> <executable>echo</executable> <arguments> <argument>version=${project.version}</argument> <argument>></argument> <argument>${project.build.directory}/VERSION.txt</argument> </arguments> </configuration> </execution> </executions> </plugin>
<profiles> <profile> <id>dev</id> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptors> <descriptor>src/assembly/dev.xml</descriptor> </descriptors> </configuration> </plugin> </plugins> </build> </profile> </profiles>
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-gpg-plugin</artifactId> <version>1.6</version> <executions> <execution> <id>sign-artifacts</id> <phase>verify</phase> <goals> <goal>sign</goal> </goals> </execution> </executions> </plugin>
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <executable>true</executable> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> <!-- 配合Assembly插件 --> <assembly> <fileSets> <fileSet> <directory>${project.build.directory}</directory> <outputDirectory>/</outputDirectory> <includes> <include>*.jar</include> </includes> </fileSet> <fileSet> <directory>src/main/resources</directory> <outputDirectory>/config</outputDirectory> </fileSet> </fileSets> </assembly>
现象:ZIP包中包含重复的依赖 解决:在dependencySet中配置<useProjectArtifact>false</useProjectArtifact>
现象:Linux脚本不可执行 解决:在fileSet中设置<fileMode>755</fileMode>
优化方案: 1. 排除不必要的依赖 2. 使用<dependencySets>
的<useStrictFiltering>true</useStrictFiltering>
3. 并行构建(Maven 3.x+)
本文详细介绍了在Maven项目中创建自定义ZIP包的多种方法,主要要点包括:
核心插件选择:
最佳实践:
扩展思路:
通过灵活运用Maven插件生态系统,开发者可以构建出完全符合业务需求的发布包,满足各种复杂的部署场景要求。
注意:本文示例基于Maven 3.6+版本,部分配置在旧版本中可能需要调整。实际使用时请根据项目具体情况适当修改配置参数。 “`
这篇文章共计约6900字,详细介绍了Maven项目打包自定义ZIP包的完整方案,包含基础配置、高级技巧和实战案例,采用Markdown格式编写,可直接用于技术文档发布。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。