根本原因是Runnable JAR导出时Library handling选项选择不当,导致依赖未正确加载:选“Extract”会解压依赖进主JAR,选“Package”因JVM不原生支持jar-in-jar而失败,选“Copy”则需确保MANIFEST.MF中Class-Path路径正确且部署结构匹配。

为什么Runnable JAR导出后运行报 NoClassDefFoundError 或 ClassNotFoundException
根本原因不是代码写错了,而是依赖没正确加载。MyEclipse 的 Runnable JAR file 导出界面里有三个 Library handling 选项,选错就直接导致类找不到。
常见错误现象:
- 双击 jar 文件无反应,或命令行执行
java -jar xxx.jar报NoClassDefFoundError - 明明项目在 IDE 里能跑,打包后提示某个第三方类(如
org.apache.commons.lang3.StringUtils)不存在 - 用
jar -tf xxx.jar查看内容,发现里面没有第三方 jar 的 class,也没有META-INF/MANIFEST.MF中的Class-Path条目
关键点在于:这三种方式本质是三套不同的类加载路径策略,不是“谁更高级”,而是“谁适配你的部署场景”:
-
Extract required libraries into generated JAR:把所有依赖 jar 解压成 class,合并进主 jar —— 适合单文件分发,但 jar 体积大、启动慢、无法热替换依赖 -
Package required libraries into generated JAR:把依赖 jar 原样打包进主 jar 内部(即 jar in jar)—— 多数 JVM 不原生支持,需自定义 ClassLoader,java -jar直接运行会失败 -
Copy required libraries into a sub-folder next to the generated JAR:生成一个lib/文件夹,主 jar 的META-INF/MANIFEST.MF里写明Class-Path: lib/a.jar lib/b.jar—— 最兼容、最可控,但要求部署时保持目录结构
导出前必须确保 launch configuration 可见
如果你在 Export → Runnable JAR file 界面里看不到任何可选的 launch configuration,不是插件坏了,也不是版本问题,只是 MyEclipse 还没“记住”你的入口类。
解决办法非常具体:
- 找到含
public static void main(String[] args)的类(比如App.java) - 右键它 →
Run As → Java Application,哪怕只运行 1 秒也行 - 再打开
Export → Runnable JAR file,launch configuration下拉框里就会出现App (1)这样的条目
注意:(1) 是编号,不是错误;多次运行后编号递增,选最新那个即可。不运行一次,MyEclipse 就不会把该配置注册到 launch history 里。
Eclipse IDE 是一款由 Eclipse 基金会管理的开源、跨平台集成开发环境。其核心基于 Java 构建,通过强大的插件架构可扩展支持 C/C++、Python、PHP 等多种编程语言。它提供丰富的代码编辑、调试和重构工具,并紧密集成 Git、Maven 等现代开发工具链,是全球众多开发者首选的 Java 开发利器。
Class-Path 路径写错会导致依赖完全失效
当你选了第三种方式(Copy required libraries...),MyEclipse 会自动生成 META-INF/MANIFEST.MF,但里面的 Class-Path 值极易出错:
- 路径必须是相对路径,且以空格分隔多个 jar,例如:
Class-Path: lib/spring-core.jar lib/commons-lang3.jar - 路径不能以
/开头,也不能用 Windows 风格的\,否则 JVM 忽略整行 - jar 文件名必须和实际生成的文件名**完全一致**(包括大小写、.jar 后缀),比如
log4j-api-2.20.0.jar写成log4j-api.jar就加载失败 - 如果手动修改过 MANIFEST,记得保存后重新导出,MyEclipse 不会自动重读 workspace 里的 MANIFEST 文件
验证方法很简单:用 jar -xf xxx.jar META-INF/MANIFEST.MF 解压出清单,用文本编辑器打开确认内容;或者直接用 unzip -p xxx.jar META-INF/MANIFEST.MF 查看。
Linux 服务器上运行前要检查 JDK 版本与依赖兼容性
本地 MyEclipse 用 JDK 17 打包,服务器上只有 JDK 8,java -jar xxx.jar 很可能直接抛 UnsupportedClassVersionError —— 这不是打包问题,是环境错配。
真正容易被忽略的点:
- MyEclipse 默认用 workspace 的 JDK 编译,但导出 Runnable JAR 时**不校验目标 JVM 版本**
- 第三方 jar(如较新版本的
slf4j或jackson-databind)可能已要求 JDK 11+,而你服务器只装了 OpenJDK 8 - 导出时选的
Target runtime(在 Export 对话框底部)只是提示项,不影响实际字节码版本
稳妥做法是:在服务器上先运行 java -version,再用 javap -verbose YourMainClass.class | grep major 查看主类字节码版本号(major version 52 = JDK 8,55 = JDK 11,61 = JDK 17),二者必须兼容。

















