You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:11:54