打开项目时在 Eclipse 2018-12 中找不到自动模块

Automatic modules not found in Eclipse 2018-12 when project is opened

我想使用 Eclipse 2018-12 从 Oracle JDK 8 切换到 Open JDK 11。我有以下情况:

在我的 Eclipse 工作区中,我有一个名为 example 的主 Maven 项目,其中包含一些 Maven 依赖项 my_dependency_1、my_dependency_2 也是同一工作区中的 Maven 项目。目前,只有 example 是模块化的(因此包含 module-info.java)。其他项目是非模块化的,包含在 pom.xml 以及 required(自动)模块中 模块-info.java 示例。我认出了以下内容:

当我关闭工作区中除 example 之外的所有 Eclipse 项目时,所有(非模块化)依赖项 .jars 都会正确地包含在模块路径中的 .m2 存储库中作为自动模块和我的 示例 项目 运行 没问题。我可以通过查看 运行 Configurations > Arguments > Show Command Line.

来验证这一点

相比之下,当我在我的工作区中打开带有我的依赖项的项目时,依赖项不会包含在模块路径中,因此 example 项目不会运行(导致引导层初始化时出错,java.lang.module.FindException:模块my_dependency_1,...未找到,示例要求)。

我的问题是: 我是否需要将所有 my_dependencies_1, ... 从非模块化转换为模块化如果我想在我的工作区中打开并使用它们以及我的模块化 example 项目,或者是否有任何选项可以让我继续使用非模块化依赖项目?我正在寻找一个简单而干净的解决方案,而不是 "hack" 手动将时髦的东西附加到启动参数。如果这不可能,我宁愿花一些时间将每个依赖项转换为模块化的依赖项,其缺点是在仍然为 Java 8.

编写的其他项目中不再可用

感谢您的澄清:)

下面是一个基本的演示示例:

pom.xml(项目示例

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>example</artifactId>
  <version>1.0-SNAPSHOT</version>

  <dependencies>
    <dependency>
      <groupId>com.example</groupId>
      <artifactId>mydependency</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>
  </dependencies>
</project>

Example.java(项目示例

package example;
import mydependency.MyDependency;

public class Example {
    public static void main(String[] args) { 
        MyDependency.run();
    }
}

模块-info.java(项目示例

open module example {
    requires mydependency;
}

pom.xml(项目 mydependency

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>mydependency</artifactId>
  <version>1.0-SNAPSHOT</version>
</project>

MyDependency.java(项目 mydependency

package mydependency;
public class MyDependency {
    public static void run() {
        System.out.println("run");
    }
}

如果项目关闭 运行ning 时的命令行 (正常工作):

C:\me\jdk-11.0.1\bin\javaw.exe
-Dfile.encoding=UTF-8
-p "C:\me\workspace\example\target\classes;C:\me\.m2\repository\com\example\mydependency.0-SNAPSHOT\mydependency-1.0-SNAPSHOT.jar"
-m example/example.Example

如果打开项目 运行ning 时的命令行 (缺少 mydependency 的 target/classes):

C:\me\jdk-11.0.1\bin\javaw.exe
-Dfile.encoding=UTF-8
-p "C:\me\workspace\example\target\classes"
-m example/example.Example

源项目不可能是自动模块,因为自动模块的名称是从 jar 文件名派生的。

您需要的是:

  • mvn install 在每个依赖项中
  • Maven > Disable Workspace Resolution 在每个依赖自动模块的项目上(Package Explorer 中的上下文菜单)

编辑:

  • 或者,可以关闭所有包含自动模块的项目,而不是禁用工作区解析。
  • 受此影响的人可能会支持 Eclipse Bug 543925,m2e 和 JDT 之间的合作可能会超出 JPMS 的规定:m2e 可以告诉 JDT 是什么自动模块名称,如果给定项目 从它的 jar 文件访问。在幕后 运行 该程序然后会要求 忽略 工作区分辨率,以便 JVM 找到所需的 jar 文件。