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

时间:2019-01-15 09:14:23

标签: java eclipse maven java-11 module-path

我想使用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 module-info.java required (自动)模块中>的示例。我认识到以下几点:

当我关闭工作区中除 example 以外的所有Eclipse项目时,所有(非模块化)依赖项.jars都将从模块路径中的.m2存储库中正确地包含为自动模块,而我 example 项目运行正常。我可以通过查看运行配置>参数>显示命令行来验证这一点。

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

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

感谢您的澄清:)

这是演示的基本示例:

pom.xml (来自项目 example

<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 (属于项目 example

package example;
import mydependency.MyDependency;

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

module-info.java (来自项目 example

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

如果打开了项目,则运行时的命令行(缺少独立性的目标/类)

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

1 个答案:

答案 0 :(得分:1)

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

您需要的是:

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

编辑:

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