将Java项目打包成可执行的JAR文件是Java开发中的常见需求,无论是小型工具还是大型应用,打包后的JAR能简化部署流程,实现“一次构建,随处运行”的跨平台优势,本文将从准备工作、构建工具选择、具体操作步骤及常见问题四个方面,详细解析Java项目如何高效生成JAR包。

项目打包前的准备工作
在打包前,需确保项目结构规范且依赖清晰,这是生成可执行JAR的基础。
标准化项目结构
推荐采用Maven或Gradle的标准目录结构:
src/main/java:存放Java源代码文件;src/main/resources:存放配置文件、资源文件(如application.properties、XML等);pom.xml(Maven)或build.gradle(Gradle):项目依赖与构建配置文件。
若项目未使用构建工具,需手动管理依赖,并确保所有第三方库(如JAR包)统一存放在lib目录下,便于后续打包时引用。
确定主类(Main Class)
可执行JAR需指定入口类(包含public static void main(String[] args)方法的类),在打包时,需明确主类的全限定名(如com.example.MainApp),否则运行时会提示“找不到主类”。
主流构建工具:Maven与Gradle
实际开发中,Maven和Gradle是最常用的构建工具,能自动处理依赖、编译代码并生成JAR包,推荐优先使用。
使用Maven打包
Maven通过pom.xml配置打包参数,核心步骤如下:
(1)配置基础打包插件
在pom.xml中,默认的maven-jar-plugin可生成基础JAR,但需手动配置主类:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<mainClass>com.example.MainApp</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
(2)处理依赖(生成Fat JAR)
若需将所有依赖打入JAR(避免运行时依赖外部环境),可使用maven-assembly-plugin或maven-shade-plugin,以shade-plugin为例:

<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.MainApp</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
执行mvn clean package后,会在target目录下生成包含所有依赖的Fat JAR(如your-app-1.0-SNAPSHOT.jar)。
使用Gradle打包
Gradle通过build.gradle配置,语法更简洁,适合灵活的项目需求。
(1)基础JAR配置
在build.gradle中,Java插件默认会生成JAR,需指定主类:
jar {
manifest {
attributes 'Main-Class': 'com.example.MainApp'
}
}
(2)生成Fat JAR
使用shadow插件(需先添加插件:id 'com.github.johnrengelman.shadow' version '7.1.2'),配置如下:
shadowJar {
archiveBaseName = 'your-app'
archiveVersion = '1.0'
manifest {
attributes 'Main-Class': 'com.example.MainApp'
}
}
执行gradle shadowJar后,生成的Fat JAR位于build/libs目录(如your-app-1.0-all.jar)。
手动打包:适合小型项目
若项目未使用Maven/Gradle,可通过手动方式打包,步骤如下:
- 编译源码:进入
src/main/java目录,执行javac -d ../classes com/example/*.java,编译后的.class文件存放在../classes目录。 - 收集依赖:将所有第三方JAR包复制到
lib目录。 - 创建JAR:在项目根目录执行以下命令:
jar -cvfe myapp.jar com.example.MainApp -C classes/ .
参数说明:
-c创建JAR、-v显示过程、-f指定文件名、-e指定主类、-C切换目录(classes为编译后的目录)。 - 处理依赖:手动生成的JAR默认不包含依赖,运行时需通过
-cp参数指定类路径:java -cp "myapp.jar:lib/*" com.example.MainApp
(Linux/macOS用分隔路径,Windows用)

常见问题与解决方案
-
“找不到主类”错误
- 原因:Manifest中
Main-Class配置错误(如类名未写全限定名,或路径包含)。 - 解决:检查
pom.xml或build.gradle中的主类配置,确保格式为包名.类名。
- 原因:Manifest中
-
依赖未找到(NoClassDefFoundError)
- 原因:Fat JAR未包含依赖,或运行时类路径未正确指定。
- 解决:使用
shade或assembly插件生成包含所有依赖的Fat JAR,避免手动管理类路径。
-
JAR体积过大
- 原因:Fat JAR包含无用依赖(如测试库、示例代码)。
- 解决:通过
shade-plugin的filters排除无用文件,或使用模块化JPMS(Java 9+)优化依赖。
将Java项目打包成JAR的核心在于明确主类、正确处理依赖,并根据项目规模选择合适的打包方式:
- Maven/Gradle:适合中大型项目,能自动管理依赖和构建流程,推荐使用
shade或assembly插件生成Fat JAR; - 手动打包:适合小型项目,但需手动处理依赖和类路径,维护成本较高。
无论采用哪种方式,打包后务必通过java -jar your-app.jar测试可执行性,确保配置无误,规范的打包流程不仅能提升部署效率,也能避免因环境差异导致的问题。


















