核心概念
在开始之前,我们需要理解几个关键点:

- JAR (Java Archive):本质上是一个 ZIP 格式的压缩包,包含了你的
.class文件、资源文件(如图片、配置文件等)和META-INF目录下的清单文件。 Main-Class:这是 JAR 文件清单文件中的一个特殊属性,它告诉 Java 虚拟机(JVM)当使用java -jar命令运行这个 JAR 文件时,应该从哪个类开始执行,这个类必须包含一个public static void main(String[] args)方法。- 依赖项:你的项目可能依赖外部的库(JAR 文件),Log4j、Jackson 等,这些依赖项也需要被包含进最终的 JAR 中,否则程序会因为找不到类而抛出
ClassNotFoundException。
使用 Eclipse 的内置导出功能(简单项目)
如果你的项目非常简单,只有一个源文件,没有依赖任何外部库,这是最快的方法。
步骤:
-
准备项目
- 确保你的项目已经成功编译,没有错误。
- 在你的主类(包含
main方法的类)上,右键 ->Run As->Java Application,确保程序可以正常运行。
-
打开导出向导
(图片来源网络,侵删)- 在 Eclipse 的 Package Explorer 视图中,右键点击你的项目。
- 选择
Export(导出)。
-
选择导出类型
- 在弹出的窗口中,展开
Java文件夹,选择Runnable JAR file(可运行的 JAR 文件),然后点击Next。
- 在弹出的窗口中,展开
-
配置 JAR 导出选项
- Launch configuration:选择你之前用来运行项目的配置,如果你只用一个
main方法,通常它会自动选中,你可以通过点击Search...按钮来查找或创建。 - Export destination:选择你想要保存 JAR 文件的位置和文件名(
C:\MyProject\my-app.jar)。 - Library handling:这是最关键的一步,对于没有外部依赖的项目,选择
Extract required libraries into generated JAR(将所需的库解压到生成的 JAR 中)即可,如果项目有依赖,这个选项会把依赖的 JAR 内容也解压到最终的 JAR 中,形成一个大的“胖 JAR”。 - Package required libraries into generated JAR:将依赖的 JAR 作为一个内嵌的包打包进去,这种方式比解压更整洁,但运行时可能会有性能开销。
- Launch configuration:选择你之前用来运行项目的配置,如果你只用一个
-
完成导出
- 点击
Finish,Eclipse 会开始构建 JAR 文件。
- 点击
-
验证
(图片来源网络,侵删)- 打开命令行(CMD 或 PowerShell),进入到你保存 JAR 文件的目录。
- 运行命令:
java -jar my-app.jar - 如果程序成功启动,说明打包成功。
使用 Maven 插件(推荐,处理复杂依赖)
如果你的项目有复杂的外部依赖,强烈推荐使用 Maven 来管理项目依赖和打包,Maven 会自动处理所有依赖关系,生成标准的 JAR 文件。
前提条件:
- 你的项目已经配置了 Maven(右键项目 ->
Configure->Convert to Maven Project)。 pom.xml文件中已经正确声明了所有依赖。
步骤:
-
配置
pom.xml- 打开
pom.xml文件。 - 确保你的主类信息被正确配置在
<build>标签下,这是为了让 Maven 知道哪个类是程序的入口。
<project ...> ... <build> <plugins> <!-- 这是核心插件,用于构建可执行 JAR --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</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.myapp.Main</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> ... </project>maven-shade-plugin:这是一个非常强大的插件,它不仅可以打包,还能将所有依赖的 JAR 文件“合并”到一个最终的 JAR 中,并解决资源文件冲突,这种方式生成的 JAR 通常被称为“Uber JAR”或“Fat JAR”。<mainClass>:务必替换成你自己的主类全限定名(com.yourcompany.yourproject.YourMainClass)。
- 打开
-
在 Eclipse 中执行 Maven 构建
- 在
Package Explorer中右键点击你的pom.xml文件。 - 选择
Run As->Maven install。
- 在
-
查看结果
- Maven 会开始执行构建过程,包括下载依赖、编译代码、测试(如果配置了)、打包等。
- 构建成功后,在你的项目目录下的
target文件夹中,你会找到一个以-jar结尾的文件,my-app-1.0-SNAPSHOT.jar,这就是你最终的可执行 JAR。
-
验证
- 同样,在命令行中进入
target目录,运行:java -jar my-app-1.0-SNAPSHOT.jar
- 同样,在命令行中进入
使用 Gradle 插件(另一种现代构建工具)
如果你的项目使用 Gradle,过程与 Maven 类似,但配置文件是 build.gradle。
前提条件:
- 项目已配置 Gradle。
build.gradle文件中已声明依赖。
步骤:
-
配置
build.gradle- 打开
build.gradle文件。 - 添加
application插件,它提供了方便的构建可执行 JAR 的任务。
plugins { id 'java' id 'application' // 添加这个插件 } // 定义源代码和JAR的编码 sourceCompatibility = '1.8' targetCompatibility = '1.8' // 定义主类 mainClassName = 'com.example.myapp.Main' // 替换为你的主类 // 声明仓库 repositories { mavenCentral() } // 声明依赖 dependencies { implementation 'log4j:log4j:1.2.17' // 示例依赖 } // Gradle 7.0 之后,推荐使用 jar 任务来配置 jar { manifest { attributes 'Main-Class': mainClassName } // from { configurations.compile.collect { zipTree(it) } } // 旧版方式 from { configurations.runtimeClasspath.collect { zipTree(it) } } // 新版方式,将所有依赖打包进JAR } - 打开
-
在 Eclipse 中执行 Gradle 构建
- 在
Package Explorer中右键点击你的项目。 - 选择
Run As->Gradle Build。 - 在弹出的窗口中,对于
Gradle Task,输入build或jar,然后点击Run。
- 在
-
查看结果
- 构建成功后,在
build/libs目录下会生成你的 JAR 文件。
- 构建成功后,在
-
验证
- 在命令行进入
build/libs目录,运行:java -jar your-project-name.jar
- 在命令行进入
常见问题与解决方案 (FAQ)
Q1: 运行 JAR 时报错 no main manifest attribute, in my-app.jar
原因:JAR 文件的 META-INF/MANIFEST.MF 文件中没有正确指定 Main-Class 属性。
解决方案:
- 使用 Eclipse 导出时:确保在
Runnable JAR file向导中正确选择了Launch configuration。 - 使用 Maven/Gradle 时:确保在
pom.xml或build.gradle中正确配置了mainClass或mainClassName,并重新构建项目。
Q2: 运行 JAR 时报错 ClassNotFoundException: com.example.SomeLibrary
原因:JAR 文件缺少
