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

Java 打开项目时在Eclipse 2018-12中找不到自动模块,java,eclipse,maven,java-11,module-path,Java,Eclipse,Maven,Java 11,Module Path,我想使用Eclipse 2018-12从Oracle JDK 8切换到打开JDK 11。我有以下情况: 在我的Eclipse工作区中,我有一个名为example的主maven项目,其中包含一些maven依赖项my_dependency_1、my_dependency_2,它们也是同一工作区中的maven项目。目前,唯一的示例是模块化的(因此包含一个模块info.java)。其他项目是非模块化的,包含在pom.xml中,以及示例的module-info.java中所需的(自动)模块中。我认识到:

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

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

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

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

我的问题是:我是否需要转换我的所有依赖项。。。从非模块依赖到模块依赖,如果我想在我的工作区中与模块化示例项目一起打开并使用它们,或者是否有任何选项允许我继续使用非模块依赖项目?我在寻找一个简单而干净的解决方案,而不是在启动参数中手动添加一些古怪的东西。如果这是不可能的,我宁愿花一些时间将每个依赖项转换为模块化依赖项,其缺点是在仍然为Java8编写的其他项目中不再可用

感谢您的澄清:)

以下是演示的基本示例:

pom.xml(项目示例)

模块信息.java(项目示例)

pom.xml(属于项目mydependency)

在项目关闭时运行命令行(正常工作):

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


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

您需要的是:

  • mvn在每个依赖项中安装
  • Maven>对依赖于自动模块的每个项目禁用工作区解析
    (包资源管理器中的上下文菜单)
编辑:

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

当我在我的工作区中打开带有依赖项的项目时,依赖项不会包含在模块路径中。。。可能这就是答案所在,Eclipse操纵依赖关系本身可能就是问题所在?@nullpointer:谢谢您的反馈。问题是开放项目的/target/classes文件夹不会包含在--module路径(或-p)中,而.m2中的.jar文件夹会正确地包含在--module路径中。因此,依赖项本身不会被修改,只是在--module path中丢失了。对于我来说,如果Eclipse还包括/target/classes,这是合乎逻辑的,但默认情况下,情况显然不是这样。我的问题是,Eclipse中是否有一个选项可以用来实现这种行为?您能否给出一个代码示例(
pom.xml
module info.java
和java代码)来重现您的问题?在这个场景中使用JPMS的好处是什么?@howlger:我在我的原始帖子中添加了一个完整的示例:打开项目时,在启动层java.lang.module.FindException初始化过程中发生错误:找不到模块mydependency,这是示例所要求的。执行maven安装并关闭工作区中的项目后,示例代码将运行。关于您关于JPMS好处的问题:对于我们的主要项目,我们使用jlink,因此我们必须升级到Java 9+和JPMS及其好处。@user27772我明白了。目标是减少磁盘空间还是加快启动速度?如果是后者,您是否使用
-Xshareclasses
尝试过OpenJ9?我很想知道,即使这与您的问题并不相关。我希望Eclipse能够自动处理这些情况,因为m2e确实知道生成的.jar文件的名称,并且可以构建正确的模块路径和类路径,而无需您描述的手动步骤。但就目前而言,我知道每个非模块化的工作区项目,比如mydependency(或者更具体地说,不包含module info.java的项目),都必须安装到.m2中,然后在工作区中的其他项目依赖它时关闭,您可以这样写:依赖于自动模块的每个项目都必须关闭工作区解析。这对我来说似乎是不可接受的:它会影响e。G仅依赖于外部Maven存储库的非模块化工件的所有项目,以及依赖于模块化工作区项目和启用工作区分辨率的非模块化外部工件的混合的所有项目。这是真的吗?我们经常使用工作空间分辨率,因此编写此类项目的代码就没有那么有趣了:(
<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>
package example;
import mydependency.MyDependency;

public class Example {
    public static void main(String[] args) { 
        MyDependency.run();
    }
}
open module example {
    requires 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>
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