Maven打包方式全解析

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:包含所有依赖的 JAR
    • bin:包含启动脚本的二进制分发
    • 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 打包作为父模块
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值