maven打包插件
原创...大约 4 分钟
摘要
本文详细介绍了Maven项目中常用的打包插件及其配置方法。主要涵盖三个核心插件:
maven-compiler-plugin - 负责编译Java源码,将.java文件转换为.class文件,支持配置Java版本和编码格式。
maven-jar-plugin - 创建普通JAR包,将编译后的class文件和资源文件打包,生成轻量级jar文件(不包含依赖)。
spring-boot-maven-plugin - 专为Spring Boot项目设计,创建可执行的"fat jar",包含所有依赖项,支持java -jar直接运行。
文章重点对比了普通Maven项目与Spring Boot项目的构建流程差异,以及不同插件输出文件的特点和运行方式,帮助开发者根据项目需求选择合适的打包策略。
1. maven-compiler-plugin
功能: 编译Java源码
阶段: compile阶段
作用:
- 将src/main/java下的.java文件编译成.class文件
- 控制Java版本、编码格式
- 处理注解处理器
- 输出到target/classes目录
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>17</source> <!-- 源码Java版本 -->
<target>17</target> <!-- 目标Java版本 -->
<encoding>UTF-8</encoding> <!-- 编码格式 -->
</configuration>
</plugin>2. maven-jar-plugin
功能: 打包普通JAR文件
阶段: package阶段
作用:
- 将编译后的class文件和资源文件打包成jar
- 生成MANIFEST.MF文件
- 控制包含/排除的文件
- 创建普通jar包(不包含依赖)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<excludes>
<exclude>application*.yml</exclude> <!-- 排除配置文件 -->
</excludes>
<archive>
<manifest>
<mainClass>com.example.Main</mainClass> <!-- 指定主类 -->
</manifest>
</archive>
</configuration>
</plugin>3. spring-boot-maven-plugin
功能: 打包Spring Boot可执行JAR
阶段: package阶段
作用:
- 创建"fat jar"(包含所有依赖)
- 支持java -jar直接运行
- 内嵌Tomcat等服务器
- 提供repackage目标重新打包
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.2.9</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>com.example.Application</mainClass>
<layout>JAR</layout>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>提示
以上三个插件对比
构建流程对比
普通Maven项目:
1. maven-compiler-plugin: .java → .class
2. maven-jar-plugin: .class + resources → app.jar (瘦jar)
Spring Boot项目:
1. maven-compiler-plugin: .java → .class
2. maven-jar-plugin: .class + resources → app.jar (瘦jar)
3. spring-boot-maven-plugin: app.jar + 依赖 → app.jar (胖jar,可执行)输出文件区别
maven-jar-plugin输出:
- app-1.0.0.jar (几KB-几MB,需要classpath)
- 运行: java -cp "app.jar:lib/*" com.example.Main
spring-boot-maven-plugin输出:
- app-1.0.0.jar (几十MB,自包含)
- 运行: java -jar app.jar4. maven-source-plugin
功能: 打包源码JAR文件
阶段: package阶段
作用:
- 将src/main/java下的源码文件打包成source jar
- 便于IDE查看源码和调试
- 发布到Maven仓库时提供源码包
- 支持测试源码打包
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal> <!-- 打包主源码 -->
<goal>test-jar</goal> <!-- 打包测试源码 -->
</goals>
</execution>
</executions>
<configuration>
<excludeResources>true</excludeResources> <!-- 排除资源文件 -->
<includePom>false</includePom> <!-- 不包含pom.xml -->
</configuration>
</plugin>输出文件:
- app-1.0.0.jar (主jar包)
- app-1.0.0-sources.jar (源码包)
- app-1.0.0-test-sources.jar (测试源码包)5. maven-javadoc-plugin
功能: 生成API文档JAR文件
阶段: package阶段
作用:
- 从Java源码注释生成HTML文档
- 打包成javadoc jar文件
- 支持自定义文档样式和配置
- 发布到Maven仓库时提供文档包
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.6.0</version>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
<configuration>
<source>17</source> <!-- Java版本 -->
<encoding>UTF-8</encoding> <!-- 编码格式 -->
<charset>UTF-8</charset> <!-- 字符集 -->
<docencoding>UTF-8</docencoding> <!-- 文档编码 -->
<failOnError>false</failOnError> <!-- 忽略文档错误 -->
<quiet>true</quiet> <!-- 减少输出信息 -->
<additionalJOptions>
<additionalJOption>-Xdoclint:none</additionalJOption> <!-- 禁用严格检查 -->
</additionalJOptions>
</configuration>
</plugin>输出文件:
- app-1.0.0.jar (主jar包)
- app-1.0.0-javadoc.jar (API文档包)完整发布配置
同时使用source和javadoc插件,适合发布到Maven中央仓库:
<build>
<plugins>
<!-- 编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>17</source>
<target>17</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- 源码插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 文档插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.6.0</version>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
<configuration>
<failOnError>false</failOnError>
<additionalJOptions>
<additionalJOption>-Xdoclint:none</additionalJOption>
</additionalJOptions>
</configuration>
</plugin>
</plugins>
</build>执行结果:
mvn clean package
# 输出文件:
# target/app-1.0.0.jar (主程序包)
# target/app-1.0.0-sources.jar (源码包)
# target/app-1.0.0-javadoc.jar (文档包)6. plugins与pluginManagement
pluginManagement:
- 只定义插件版本和配置
- 不会实际执行插件
- 为子模块提供统一的插件管理
- 子模块可选择性使用
plugins:
- 实际执行的插件
- 会在构建过程中运行
- 子模块会继承父工程的plugins
- 立即生效
使用原则:
1. 父工程用 pluginManagement 统一管理版本
2. 父工程用 plugins 定义所有子模块都需要的插件
3. 子模块用 plugins 声明实际需要的插件
4. 避免在父工程 plugins 中放置只有部分子模块需要的插件7. 资源相关
7.1 排除资源文件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>default-resources</id>
<configuration>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>application*.yml</exclude>
</excludes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>8. 其余插件
- maven-assembly-plugin
Powered by Waline v3.6.0