Java 9 - 无法作为模块解析

Java 9 - Cannot be resolved as a module

非常简单的用例,我正在使用 Eclipse Oxygen 4.7.3a,其中包括来自 Java 9 的支持。我有两个项目是 Java 9 个项目:

- projectOne
| - src
| - module-info.java
  | - com
    | - package1
      | - first
        | Classificator.java

- projectTwo
| - src
| - module-info.java
  | - com
    | - package2
      | - second
        | Classifiable.java

我想在Classificator中使用Classifiableclass,所以我尝试将第二个模块导入到第一个项目中。

模块-info.java 项目 1:

module projectOne   {
    requires projectTwo;
}

模块-info.java 项目 2:

module projectTwo   {

}

Eclipse 给我错误:

projectTwo cannot be resolved to a module

我是否必须将所有 Java 项目集中在一个 "main project" 下,以便让 Eclipse 知道所有这些模块都可以在其中使用?还是我漏掉了什么?

不,您不需要将它们放在同一目录中。理想情况下,您的 project-one 模块定义了一些 uses,它们由您的 project-two 模块实现(反之亦然)。获取您使用的接口的运行时实现。为此,jars/classes 都必须在模块路径上。

有关模块构建、多模块构建等的更多信息,...您可以参考 this link. Even if you do not use gradle, its tutorial on java 9 module build 非常有趣并提供了一些见解。

虽然连接即服务当然是一种可行的方法(如其他答案中所述),但让我补充一点,requires 当然也可以工作。

第一种方法可能遗漏的一点是:Eclipse 仍然需要知道在哪里寻找模块。在现实世界的项目中,这通常由您选择的构建工具加上像 m2e or buildship.

这样的插件来调解。

如果没有使用这样的插件,为了使项目projectTwo可见,需要在项目projectOne的Build Path中添加一个正常的项目依赖。一旦项目在构建路径上,项目定义的模块可以在 module-info.java.

中的引用中解析