
本文详解如何通过 Maven 的标准生命周期和插件机制,从 target/classes 中正确打包 Java 类为 JAR 文件,并解决常见误区(如错误配置 maven-jar-plugin 导致类未被包含的问题)。
本文详解如何通过 maven 的标准生命周期和插件机制,从 target/classes 中正确打包 java 类为 jar 文件,并解决常见误区(如错误配置 maven-jar-plugin 导致类未被包含的问题)。
Maven 默认在执行 mvn package 时,会自动将编译完成的字节码(即 target/classes/ 下的 .class 文件)打包进 JAR,无需额外配置 maven-jar-plugin。你当前的配置存在两个关键问题:
-
路径错误:
<include></include>指向的是target/generated-sources/main/**/*.java(Java 源文件),但maven-jar-plugin默认打包的是已编译的类文件(.class),且其默认源目录是target/classes,而非源码路径; -
时机与职责错配:
maven-jar-plugin的作用是 归档已存在的 class 文件,它不负责编译或拷贝资源;若target/classes为空或未生成,插件自然无法打包任何类。
✅ 正确做法如下:
-
仅打包自身代码(无依赖):直接运行
mvn clean package
Maven 会自动执行
compile → resources → jar阶段,生成target/{artifactId}-{version}.jar,其中已包含全部target/classes/中的.class文件。 -
打包可执行 JAR(含主类):在
pom.xml的<build><plugins></plugins></build>中添加(非 profile 内):<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <mainClass>com.MyMainClass</mainClass> <addClasspath>true</addClasspath> </manifest> </archive> </configuration> </plugin>✅ 注意:此配置应放在主
<build></build>中(非 profile),确保始终生效;<mainclass></mainclass>必须指向已编译的类(包名+类名,不含.class后缀)。
Java Maven Common下载Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
打包“Fat JAR”(含所有依赖):推荐使用
maven-assembly-plugin(更稳定)或maven-shade-plugin:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.MyMainClass</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>然后执行:
mvn clean package
输出将包含
target/{artifactId}-{version}-jar-with-dependencies.jar。
⚠️ 重要提醒:
- 删除你原 profile 中的错误配置(尤其是
<includes></includes>指向.java源文件的部分),避免干扰默认行为; - 确保
com.MyMainClass已成功编译(检查target/classes/com/MyMainClass.class是否存在); - 若使用 IDE(如 IntelliJ),请先执行
mvn clean compile再验证,避免 IDE 缓存导致误判。
总结:Maven 的 package 目标本就专为生成 JAR 设计,善用默认约定、避免过度配置,是高效构建的关键。

















