我想使用 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