在 Eclipse 中定义一个 Java 9 多模块项目

Posted

技术标签:

【中文标题】在 Eclipse 中定义一个 Java 9 多模块项目【英文标题】:Define a Java 9 multi-moduled project in Eclipse 【发布时间】:2018-07-15 14:02:58 【问题描述】:

我正在尝试 Java 9 Jigsaw 模块系统(还没有模块经验),并想用它来封装我的项目中的类,但它令人困惑。

根据this article,应该可以在一个项目中拥有多个模块。我在 Eclipse Oxygen(支持 Java 9)中创建了一个新项目,其结构与文章中所示的相同。但是 Eclipse 一直告诉我,我在一个项目中不能有多个 module-info.java

我真的不知道如何告诉 Eclipse 它应该使用“多模块模式”。我真的很感激不必为每个模块都创建一个新项目。

这行得通:

这不是:

但根据this article,类似的东西应该可以工作:

那么如何使用 Eclipse 部署模块化项目呢?新的 jmod 扩展没有什么可看的。我是否仍像以前一样将其导出为可运行的 JAR 文件?

请注意,我的问题涉及使用 IDE(没有命令行,我的意思是使用 IDE 应该是可能的,对吧?)谢谢你的启发。

【问题讨论】:

请将屏幕截图添加到错误和您正在使用的项目结构中。 我添加了示例截图。 目前,Eclipse 不支持每个项目多个模块(例如,因为每个模块都有自己的 Java 构建路径)。 【参考方案1】:

我不知道这个问题是否仍然有答案,但您可以通过简单地删除构建路径上的所有源文件夹来解决这个问题。至少这适用于 Eclipse 2021-12 版本。

正如您所见,这是一个来自 Gradle 官方指南的演示项目,它有多个模块。每个模块都有自己的module-info.java

project structure in IntelliJ IDEA

如果我在 Eclipse 中打开这个项目,它会给我“module-info.java 上的重复条目”错误。

Eclipse shows the error

但是如果我删除构建路径上的所有源文件夹,错误就消失了,项目可以毫无问题地构建和运行。

project properties: Java build path

唯一的问题是您必须使用 Gradle 构建项目,以便它生成每个模块的 .jar,并且您必须稍后将它们包含在库中。

include all the .jar in libraries

我认为这可能与上面 howlger 提到的解决方案相同。

【讨论】:

【参考方案2】:

目前,Eclipse 要求您为每个模块创建一个单独的项目(例如,因为每个模块都有自己的 Java 构建路径)。

要理解这个设计决策,请考虑 Java 模块对应于 OSGi 包/Eclipse 插件,并且始终为每个包/插件有一个单独的项目。如果您来自 Maven 世界,您可能会期望更深的文件夹结构。但是模块是自包含的,将多个模块组合到一个项目中只会添加一个额外的文件夹级别,没有任何意义。但是,如果您需要额外的文件夹级别,Eclipse 支持嵌套项目和所谓的工作集。

计划于 2019 年 3 月 20 日在 Eclipse 2019-03 (4.11) 中将模块导出为图像(请参阅 Eclipse bug 518445)。将模块导出为 JAR 可以在模块路径 (-m) 上使用(请参阅 my video)。

【讨论】:

真可惜。但这至少回答了我的问题。 @Arceus,在 Eclipse 中使用模块工作了 15 年之后,我从未看到任何“多模块项目”的理由。正如 howlger 所暗示的,还有其他几种用于对模块进行分组的机制。这与普通的 javac 视图不同,其中文件夹是我们唯一拥有的东西,因此所有分组 必须 通过文件夹进行。从某种意义上说,Eclipse总是处于多模块模式,只是容器不叫“项目”而是“工作区”。 Eclipse 项目 == 模块。已经接受了。命令行编译似乎支持这种多模块模式,而 eclipse 根本不支持,这只是“一种耻辱”,因为我更喜欢只有一个工作区来在我的所有项目中拥有相同的工作区设置。而且我已经将工作集用于分组的其他含义。 @ClaudeMartin 由于 Oxygen.3 JUnit 测试也适用于模块项目(请参阅 Eclipse bug 525948 和 video)。 架构方面,我认为在 Eclipse 项目中拥有多个模块的原因有很多。包很弱以确保某种架构,而模块则足够严格以防止架构随着时间的推移而受到侵蚀。我想创建一个带有域内核和围绕它的几个适配器的六边形架构。所有这些都在一个项目中——因为它就是这样:只是一个项目。我知道osgi对此有不同的看法,说一个模块就是一个项目。但老实说,我想采用 Java9 方法,而不是坚持任何 osgi 传统。

以上是关于在 Eclipse 中定义一个 Java 9 多模块项目的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MACOS 上将 Java 从 9 降级到 8。 Eclipse 未与 Java 9 一起运行

OM5光纤跳线对比OM3/OM4有哪些优势?

Java 9 中的 Maven 更新,Eclipse 中的 Java 8 中的 Maven 编译

Java 9 Eclipse 4.7 便携式导出错误“找不到资源”、“无法从给定的启动配置中找到主要方法。”

apache tomcat 9.x 不适用于 eclipse 和 Java 10.0.1

eclipse中在一个类中定义另一个类