Maven 常见打包方式详解
Maven 提供了多种打包方式,可以根据项目需求选择不同的打包类型和配置。以下是常见的 Maven 打包方式及其详细说明:
1. 基本打包类型
1.1 JAR 打包(默认)
<packaging>jar</packaging>
- 说明:生成普通的 JAR 文件,包含编译后的类和资源文件
- 适用场景:标准 Java 应用程序、库文件
- 生成文件:
target/{artifactId}-{version}.jar
1.2 WAR 打包
<packaging>war</packaging>
- 说明:生成 Web 应用程序归档文件,包含 Web 应用所需的所有内容
- 适用场景:Java Web 应用程序(部署到 Tomcat 等 Servlet 容器)
- 生成文件:
target/{artifactId}-{version}.war
- 特殊目录结构:
src/main/webapp/ ├── WEB-INF/ │ ├── web.xml │ └── classes/ ├── index.jsp └── resources/
1.3 EAR 打包
<packaging>ear</packaging>
- 说明:生成企业级应用程序归档文件,可包含多个 WAR/EJB 模块
- 适用场景:Java EE 企业级应用(部署到 JBoss、WebLogic 等应用服务器)
- 生成文件:
target/{artifactId}-{version}.ear
1.4 POM 打包
<packaging>pom</packaging>
- 说明:仅作为父 POM 或聚合模块,不生成实际构件
- 适用场景:多模块项目的父 POM、依赖管理模块
2. 特殊用途打包
2.1 可执行 JAR(Fat JAR/Uber JAR)
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
- 说明:包含所有依赖的独立可执行 JAR
- 适用场景:Spring Boot 应用、微服务
- 生成命令:
mvn clean package
2.2 源码打包
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
- 说明:生成包含项目源代码的 JAR 文件
- 适用场景:开源项目、库文件分发
- 生成文件:
target/{artifactId}-{version}-sources.jar
- 生成命令:
mvn source:jar
2.3 Javadoc 打包
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
- 说明:生成包含 API 文档的 JAR 文件
- 适用场景:开源项目、库文件分发
- 生成文件:
target/{artifactId}-{version}-javadoc.jar
- 生成命令:
mvn javadoc:jar
3. 高级打包方式
3.1 使用 Maven Assembly 插件
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.example.Main</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
- 说明:创建自定义装配,包含依赖、脚本、配置文件等
- 预定义描述符:
jar-with-dependencies
:包含所有依赖的 JARbin
:包含启动脚本的二进制分发src
:源码分发
- 自定义描述符:可创建
src/main/assembly/package.xml
定义精确的打包内容
3.2 使用 Maven Shade 插件
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.Main</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
- 说明:创建包含所有依赖的可执行 Uber JAR,并解决依赖冲突
- 优势:比 Assembly 插件更擅长处理依赖冲突和资源转换
4. 多模块项目打包
4.1 聚合模块
<!-- 父 POM -->
<packaging>pom</packaging>
<modules>
<module>module1</module>
<module>module2</module>
<module>module3</module>
</modules>
- 说明:父模块只管理子模块,不生成实际构件
- 打包命令:
mvn clean package
(会构建所有子模块)
4.2 依赖模块
- 子模块可以是任意打包类型(JAR、WAR 等)
- 模块间通过
<dependencies>
引用
5. 打包命令与参数
5.1 基本命令
# 编译并打包
mvn package
# 跳过测试打包
mvn package -DskipTests
# 清理后重新打包
mvn clean package
# 指定环境打包
mvn clean package -P prod
5.2 高级参数
# 指定最终名称
mvn package -DfinalName=myapp
# 只打包指定模块(多模块项目)
mvn package -pl module1 -am
# 并行构建
mvn package -T 4
6. 常见问题与解决方案
6.1 依赖冲突
- 问题:多个依赖包含相同类的不同版本
- 解决:使用
mvn dependency:tree
分析依赖,使用<exclusions>
排除冲突依赖
6.2 资源过滤
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
- 说明:启用资源过滤,可以在配置文件中使用 Maven 属性
6.3 配置文件区分
<profiles>
<profile>
<id>dev</id>
<properties>
<env>development</env>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<env>production</env>
</properties>
</profile>
</profiles>
- 说明:为不同环境创建不同的打包配置
总结
选择合适的打包方式取决于项目需求:
- 简单库项目:使用默认 JAR 打包
- Web 应用:使用 WAR 打包
- 微服务/独立应用:使用 Spring Boot 或 Shade 插件创建可执行 JAR
- 企业级应用:使用 EAR 打包
- 多模块项目:使用 POM 打包作为父模块