qq_37133838 2024-12-20 18:42 采纳率: 40%
浏览 4
已结题

idea 中 java 模块化问题

项目中有三个模块:

img


其中A的module-info.java配置如下:

module A {
    exports demo;
}

其中B的module-info.java配置如下:

module B {
    requires transitive A;
}

其中C的module-info.java配置如下:

module C {
    requires B;
}

但是idea却提示这个:

img




不是说transitive关键词会传递依赖么,但是我必须在C的module-info.java配置requires A;才可以正常工作,是不是idea有什么特别的配置,我刚接触模块化,对这块有点不熟,麻烦解答一下

  • 写回答

1条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    确实,你正确地理解了Java模块化中的 requirestransitive 关键词的作用。在Java模块化系统中,如果一个模块 A 被模块 B 通过 requires A 来引用,那么模块 B 可以访问模块 A 中的所有公共包和类。同时,如果模块 Arequires 了其他模块,这些被要求的模块也会被模块 B 自动继承,这就是所谓的传递性依赖。因此,在你的例子中,模块 C 应该可以通过 requires B 来间接访问模块 A 中的内容。

    然而,IDEA(IntelliJ IDEA)在处理模块化项目时有时可能会有一些提示或者处理上的误解。这可能是由以下几个原因导致的:

    1. 项目同步问题:尝试重新同步项目或者重启IDEA,看看问题是否解决。你可以通过点击IDEA顶部的 "Sync Project"(同步项目)按钮或者重启IDEA来尝试解决这个问题。
    2. 模块路径问题:检查你的模块路径设置是否正确。确保所有的模块都在正确的路径下,并且模块之间的依赖关系设置正确。你可能需要在项目的构建路径(Build Path)或者项目结构(Project Structure)设置中检查这些。
    3. IDEA对模块化支持的局限性:在某些情况下,IDEA可能对模块化支持的并不完全,特别是在处理复杂的模块依赖关系时。你可能需要查看IDEA的官方文档或者更新到最新版本的IDEA来获取更好的模块化支持。

    关于你的具体问题,你提到必须在模块 C 中添加 requires A; 才能正常工作。这可能是因为在IDEA中,如果没有显式地在模块 C 中添加对模块 A 的要求,IDEA可能无法正确地解析模块间的依赖关系。所以你可以尝试在模块 Cmodule-info.java 中添加 requires A; 语句来解决问题。然后你可以通过移除对模块 B 的要求并添加 requires transitive B; 来验证是否确实能通过传递性依赖来访问模块 A 中的内容。如果这样做可以解决问题,那么可能就是IDEA在处理模块化时的某种局限性导致的。

    总的来说,处理Java模块化时遇到的一些问题可能需要你熟悉IDEA的使用以及Java模块化的细节。你可以查阅相关的文档或者在线社区来获取更多的帮助。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月23日
  • 创建了问题 12月20日