为什么打包会遇到问题?
在打包之前,你需要理解一个核心问题:JAR 文件本身并不知道你的代码依赖了哪些外部库(.jar 文件)。

当你双击一个 JAR 文件运行时,JVM(Java 虚拟机)只会加载这个主 JAR 文件里的类,如果你的代码用到了第三方库(commons-lang3.jar)或者你自己的其他模块 JAR,JVM 就会找不到这些类,从而抛出 ClassNotFoundException 或 NoClassDefFoundError。
打包的关键就是:如何将你的代码和它所依赖的所有资源(包括其他 JAR)打包在一起,并告诉 JVM 如何启动程序。
使用 Eclipse 的 "Export" 功能(简单但不推荐)
这是最直接的方法,适合非常简单的、没有外部依赖的“Hello World”程序。但对于任何有依赖的项目, 强烈不推荐 使用此方法,因为它几乎肯定会导致 ClassNotFoundException。
适用场景:只有一个 .jar 文件,且没有任何外部依赖。

步骤:
- 选中项目:在 Eclipse 的 "Package Explorer" 中,右键点击你的 Java 项目。
- 导出:选择
Export->Java->Runnable JAR file,然后点击Next。 - 配置:
- Launch configuration:选择你用来运行程序的配置(通常是你包含
main方法的那个类)。 - Export destination:选择你要生成的 JAR 文件保存的位置和文件名(
C:\myapp\my-app.jar)。 - Library handling:这是最关键的一步,默认是
Extract required libraries into generated JAR,它会将依赖的库解压并直接塞进你的主 JAR 文件里,这会导致 JAR 文件巨大,启动速度慢,且不符合 JAR 标准。
- Launch configuration:选择你用来运行程序的配置(通常是你包含
- 完成:点击
Finish。
为什么不推荐?
- 依赖管理混乱:所有依赖都被打成一个包,难以管理。
- 启动慢:JVM 需要解压整个大文件才能运行。
- 不符合标准:标准的 JAR 应该是模块化的。
使用 Maven(强烈推荐)
这是目前 Java 生态中最主流、最专业、最可靠的构建和打包方式,如果你的项目使用 Maven,打包会变得非常简单和自动化。
前提:你的项目已经配置了 pom.xml 文件,并且所有依赖都在 <dependencies> 中正确声明。
步骤:
-
确保
pom.xml配置正确:- 打包方式:在
<properties>或<build>中确认打包方式是jar(默认)。 - 主类入口:在
<build>-><plugins>-><plugin>-><configuration>中指定你的主类。<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>com.yourcompany.yourapp.Main</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build><mainClass>: 替换成你自己的主类全名。<addClasspath>true</addClasspath>: 这个配置会告诉 Maven 在MANIFEST.MF文件中生成一个Class-Path条目,列出所有依赖的 JAR 文件。注意:这种方式生成的Class-Path是相对路径,在部署时可能需要调整。
- 打包方式:在
-
执行打包命令:
- 在 Eclipse 中:右键点击
pom.xml文件,选择Run As->Maven install。 - 或在命令行中:进入项目根目录(有
pom.xml的目录),运行mvn clean install。
- 在 Eclipse 中:右键点击
-
查找生成的 JAR:
- 打包成功后,你会在
target目录下找到两个 JAR 文件:your-app-1.0-SNAPSHOT.jar:这是你的主程序 JAR。your-app-1.0-SNAPSHOT-jar-with-dependencies.jar:这是你真正需要的文件! 它是一个“胖 JAR”(Fat JAR),包含了你的代码和所有依赖,可以直接运行。
- 打包成功后,你会在
如何运行生成的 JAR? 直接在命令行运行即可:
java -jar target/your-app-1.0-SNAPSHOT-jar-with-dependencies.jar
使用 Gradle(现代且灵活)
Gradle 是另一个非常流行的构建工具,比 Maven 更灵活,配置更简洁。
前提:你的项目已经配置了 build.gradle 文件,并且所有依赖都在 dependencies 中正确声明。
步骤:
-
确保
build.gradle配置正确:-
应用 Java 插件:
apply plugin: 'java' -
指定主类:在
jar任务中指定主类。plugins { id 'java' } // 声明依赖 dependencies { implementation 'org.apache.commons:commons-lang3:3.12.0' // ... 其他依赖 } // 指定主类 jar { manifest { attributes 'Main-Class': 'com.yourcompany.yourapp.Main' } from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } { exclude 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA' } }Main-Class: 替换成你自己的主类全名。from { ... }: 这个配置会将所有依赖的 JAR 文件内容“合并”到你的主 JAR 中,生成一个“胖 JAR”。
-
-
执行打包命令:
- 在 Eclipse 中:右键点击
build.gradle文件,选择Run As->Gradle Build,然后在 Tasks 中找到build或jar任务执行。 - 或在命令行中:进入项目根目录,运行
gradle build。
- 在 Eclipse 中:右键点击
-
查找生成的 JAR:
- 打包成功后,你会在
build/libs目录下找到your-app.jar,这就是可以直接运行的“胖 JAR”。
- 打包成功后,你会在
如何运行生成的 JAR? 直接在命令行运行即可:
java -jar build/libs/your-app.jar
手动创建一个可运行的 JAR(高级)
如果你不使用 Maven 或 Gradle,也可以手动完成,这需要你手动管理所有依赖。
步骤:
-
创建目录结构: 在你的项目外创建一个新的文件夹,
MyApp-Dist。MyApp-Dist/lib/(用于存放所有依赖的 JAR 文件)MyApp.jar(你的主程序 JAR)run.bat(Windows 启动脚本)run.sh(Linux/Mac 启动脚本)
-
复制文件:
- 将你的主程序 JAR(通过 Eclipse
Export->JAR file生成,不包含依赖)复制到MyApp-Dist目录下。 - 将你项目中所有用到的外部 JAR 文件(比如从 Maven 仓库下载的)复制到
lib目录下。
- 将你的主程序 JAR(通过 Eclipse
-
创建启动脚本:
run.bat(Windows):@echo off java -cp "MyApp.jar;lib/*" com.yourcompany.yourapp.Main pause
run.sh(Linux/Mac):#!/bin/bash java -cp "MyApp.jar:lib/*" com.yourcompany.yourapp.Main
- 注意:
-cp(classpath) 分隔符在 Windows 是 ,在 Linux/Mac 是 。 lib/*是一个通配符,表示lib目录下的所有文件。com.yourcompany.yourapp.Main是你的主类全名。
- 注意:
-
运行: 双击
run.bat或在终端中运行./run.sh即可启动程序。
总结与推荐
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
| Eclipse Export | 无需额外工具,操作简单 | 依赖管理混乱,无法正确处理依赖,生成“胖JAR”启动慢 | ⭐ (仅限无依赖的极简项目) |
| Maven | 行业标准,依赖管理清晰,自动化程度高,社区支持好 | 学习曲线稍陡,需要修改 pom.xml |
⭐⭐⭐⭐⭐ (首选,尤其适合团队项目) |
| Gradle | 配置更简洁灵活,性能好,是现代项目的新趋势 | 相对 Maven 较新,某些生态插件可能不如 Maven 成熟 | ⭐⭐⭐⭐⭐ (强烈推荐,特别是新项目) |
| 手动创建 | 灵活可控,不依赖构建工具 | 过程繁琐,容易出错,难以维护 | ⭐⭐ (适合学习或极特殊场景) |
最终建议: 对于任何严肃的项目,请务必使用 Maven 或 Gradle,它们不仅能解决打包问题,还能帮你管理依赖、编译代码、运行测试、生成文档,是现代 Java 开发的基石,Eclipse 对 Maven 和 Gradle 都有非常好的集成支持,上手后你会发现一切都变得简单高效。
