4

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

在我的 Eclipse 工作区中,我有一个名为example的主 maven 项目,其中包含一些 maven 依赖项 my_dependency_1、my_dependency_2,它们也是同一工作区中的 maven 项目。目前,只有一个例子是模块化的(因此包含一个module-info.java)。其他项目是非模块化的,包含在pom.xml以及example的module-info.java中的必需(自动)模块中。我认识到以下几点:

当我关闭工作区中除example之外的所有 Eclipse 项目时,所有(非模块化)依赖项 .jar 都会从模块路径中的 .m2 存储库中正确包含为自动模块,并且我的示例项目运行良好。我可以通过查看Run Configurations > Arguments > Show Command Line来验证这一点。

相反,当我在我的工作区中打开具有我的依赖项的项目时,依赖项不会包含在模块路径中,因此示例项目不会运行(导致启动层初始化期间发生错误,java.lang .module.FindException: 模块 my_dependency_1, ... 未找到,示例需要)。

我的问题是:如果我想在我的工作区中打开并使用它们以及我的模块化示例项目,我是否需要将所有my_dependencies_1, ...从非模块化依赖项转换为模块化依赖项,或者是否有任何选项可以让我保留即使使用非模块化依赖项目?我正在寻找一个简单而干净的解决方案,而不是手动将时髦的东西附加到启动参数的“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();
    }
}

module-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");
    }
}

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

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\1.0-SNAPSHOT\mydependency-1.0-SNAPSHOT.jar"
-m example/example.Example

如果项目已打开(缺少目标/mydependency 的类),则运行时的命令行:

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

1 回答 1

5

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

你需要的是:

  • mvn install在每个依赖项中
  • Maven > Disable Workspace Resolution在依赖于自动模块的每个项目上(包资源管理器中的上下文菜单)

编辑:

  • 或者,可以关闭所有包含自动模块的项目,而不是禁用工作区解析。
  • 受此影响的人可能会拥护 Eclipse 错误 543925,其中 m2e 和 JDT 之间的合作可能超出 JPMS 指定的范围:m2e 可以告诉 JDT如果可以从其 jar 文件访问给定项目,自动模块名称将是什么。然后在后台运行该程序将需要忽略工作区解析,以便 JVM 找到所需的 jar 文件。
于 2019-01-27T17:48:55.210 回答