Maven打包简介

Maven是Java项目中最流行的构建工具之一,它提供了标准化的项目结构、依赖管理和构建流程。Maven的打包功能允许开发者将项目代码、资源文件和依赖项打包成可分发的格式(如JAR、WAR或EAR文件)。本文将介绍Maven打包的基本概念、常用配置和最佳实践。

Maven打包基础

打包类型

Maven支持多种打包类型,在pom.xml中通过<packaging>标签指定:

1
<packaging>jar</packaging>  <!-- 默认值,生成JAR包 -->

常见的打包类型包括:

  • jar: Java应用程序或库
  • war: Web应用程序
  • pom: 父模块项目
  • ear: 企业级应用

基本打包命令

1
2
3
4
5
6
7
8
9
10
11
# 打包项目
mvn package

# 打包并跳过测试
mvn package -DskipTests

# 清理并打包
mvn clean package

# 安装到本地仓库
mvn install

Spring Boot应用打包配置

Spring Boot应用通常需要打包成可执行的JAR文件,这需要使用spring-boot-maven-plugin插件。以下是一个完整的配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 指定启动类 -->
<mainClass>com.wzz.ExamAdminApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<!-- 重新打包,将依赖打入jar包中 -->
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

插件配置说明

  • mainClass: 指定应用的主类,包含main方法的完整类名
  • repackage: 将原始JAR重新打包,添加依赖并使JAR可执行
  • excludes: 可用于排除特定依赖
  • includes: 可用于包含特定依赖

常用打包配置

跳过测试

在打包过程中跳过测试或忽略测试失败:

1
2
3
4
5
6
7
8
9
10
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<!-- 忽略测试失败 -->
<testFailureIgnore>true</testFailureIgnore>
<!-- 完全跳过测试 -->
<!-- <skip>true</skip> -->
</configuration>
</plugin>

也可以在命令行中使用:

1
2
mvn package -DskipTests        # 编译测试但不运行
mvn package -Dmaven.test.skip=true # 不编译也不运行测试

指定Java版本

1
2
3
4
5
<properties>
<java.version>11</java.version>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>

资源文件处理

1
2
3
4
5
6
7
8
9
10
11
12
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>

打包时排除某些文件

1
2
3
4
5
6
7
8
9
10
11
12
13
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<excludes>
<exclude>*.properties</exclude>
<exclude>config/**</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>

打包可执行JAR的多种方式

方式一:使用maven-shade-plugin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<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>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.MainClass</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>

方式二:使用maven-assembly-plugin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.example.MainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>

多模块项目打包

对于多模块项目,可以在父POM中配置:

1
2
3
4
5
<modules>
<module>module1</module>
<module>module2</module>
<module>module3</module>
</modules>

然后执行:

1
mvn clean package -pl module1,module2 -am  # 只打包指定模块及其依赖

打包最佳实践

  1. 使用依赖管理:使用<dependencyManagement>在父POM中统一管理依赖版本

  2. 配置资源过滤:使用filtering替换配置文件中的变量

  3. 分离配置:将环境相关配置分离,使用profiles处理不同环境

  4. 版本管理:使用maven-release-plugin管理版本发布

  5. 持续集成:将Maven打包集成到CI/CD流程中

常见问题解决

依赖冲突

使用dependency:tree命令查看依赖树,找出冲突:

1
mvn dependency:tree -Dverbose

内存不足

增加Maven可用内存:

1
export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=128m"

打包速度慢

使用并行构建:

1
mvn -T 4 clean package  # 使用4个线程构建

总结

Maven打包是Java项目构建过程中的重要环节。通过合理配置Maven插件,可以实现自动化构建、测试和部署,提高开发效率。本文介绍的配置和最佳实践可以帮助开发者更好地使用Maven进行项目打包。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.wzz.ExamAdminApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

可以添加配置跳过test报错

1
<testFailureIgnore>true</testFailureIgnore>