Eclipse Oxygen 3插件项目Java 9环境下传递依赖无法解析求助
解决Eclipse Oxygen 3中JDK9下插件项目传递依赖失效问题
我之前在Eclipse Oxygen 3里处理JDK9插件项目时,也碰到过几乎一模一样的传递依赖问题——JDK8下一切正常,切换到JDK9就报NoClassDefFoundError,本质是JDK9引入的**Java平台模块系统(JPMS)**和Eclipse早期模块化支持的适配问题,结合你的场景,给你整理几个关键解决步骤:
一、核心原因梳理
JDK9之前的类路径是扁平化的,依赖会自动传递;但JDK9的模块化机制下,模块之间的依赖默认是不传递的,加上Eclipse Oxygen 3对JPMS的支持还处于初期阶段,插件项目的依赖解析逻辑和传统Java项目有差异,才导致项目A找不到间接依赖的C类。
二、分步解决方案
1. 检查模块化配置(关键)
如果你的项目已经启用了模块化(存在module-info.java):
- 项目C的
module-info.java需要导出C类所在的包:module c { exports c; } - 项目B的
module-info.java要声明对C的依赖,并且加上transitive关键字让依赖可传递:module b { requires transitive c; exports b; // 如果A需要用到B的类,也要导出对应包 } - 项目A的
module-info.java只需要依赖B即可:module a { requires b; }
如果是非模块化项目(没有module-info.java),它们会被视为“未命名模块”,此时需要确保所有依赖都在**模块路径(Modulepath)**而非类路径(Classpath)上——JDK9对未命名模块的传递依赖支持有限,放在模块路径能解决大部分问题。
2. 调整Eclipse插件项目的依赖设置
打开项目A的属性(右键项目→Properties):
- 进入
Plug-in Development→Dependencies标签页,找到项目B的依赖项,勾选Reexport this dependency,这样项目A就能间接获取B的所有依赖(包括C)。 - 切换到
Java Build Path→Modulepath标签页,确认项目B和C都被添加到模块路径中,而不是类路径。如果之前在类路径,右键移到模块路径即可。
3. 清理重建项目(必备操作)
Eclipse的缓存经常会搞出奇怪的依赖问题:
- 执行
Project→Clean...,选择所有相关项目清理; - 右键每个项目→
Build Project重新构建; - 如果用Maven管理,再执行
Maven→Update Project同步依赖。
4. 核对JDK版本配置
- 确认三个项目的
Java Compiler设置都指向JDK9(右键项目→Properties→Java Compiler),勾选Use compliance from execution environment 'JavaSE-9' on the 'Project Facets'; - 检查运行配置(
Run→Run Configurations...),确保项目A的运行环境是JDK9,且Modulepath中包含所有依赖项目。
附:你遇到的异常信息
Exception in thread "main" java.lang.NoClassDefFoundError: c/C at b.B.<init>(B.java:9) at a.A.main(A.java:8) Caused by: java.lang.ClassNotFoundException: c.C at java.base/jdk.internal.loader.BuiltinClassLoader.loadC...
内容的提问来源于stack exchange,提问作者Madjosz
相关产品推荐
相关产品推荐

