Maven打包简介
Maven是Java项目中最流行的构建工具之一,它提供了标准化的项目结构、依赖管理和构建流程。Maven的打包功能允许开发者将项目代码、资源文件和依赖项打包成可分发的格式(如JAR、WAR或EAR文件)。本文将介绍Maven打包的基本概念、常用配置和最佳实践。
Maven打包基础
打包类型
Maven支持多种打包类型,在pom.xml中通过<packaging>标签指定:
1
| <packaging>jar</packaging>
|
常见的打包类型包括:
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> <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> </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
|
打包最佳实践
使用依赖管理:使用<dependencyManagement>在父POM中统一管理依赖版本
配置资源过滤:使用filtering替换配置文件中的变量
分离配置:将环境相关配置分离,使用profiles处理不同环境
版本管理:使用maven-release-plugin管理版本发布
持续集成:将Maven打包集成到CI/CD流程中
常见问题解决
依赖冲突
使用dependency:tree命令查看依赖树,找出冲突:
1
| mvn dependency:tree -Dverbose
|
内存不足
增加Maven可用内存:
1
| export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=128m"
|
打包速度慢
使用并行构建:
总结
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>
|