I want to switch from Oracle JDK 8 to Open JDK 11 using Eclipse 2018-12. I have the following situation:
In my Eclipse workspace I have a main maven project called example with some maven dependencies my_dependency_1, my_dependency_2 that are also maven projects in the same workspace. Currently, only example is modular (and thus contains a module-info.java). The other projects are non-modular and are included in the pom.xml as well as required (automatic) modules in the module-info.java of example. I recognized the following:
When I close all Eclipse projects in my workspace except example, then all (non-modular) dependency .jars get correctly included from the .m2 repository in the module-path as automatic modules and my example project runs fine. I can verify this by looking at Run Configurations > Arguments > Show Command Line.
In contrast, when I open the projects with my dependencies in my workspace as well, the dependencies get not included into the module-path and thus the example project doesn't run (resulting in Error occurred during initialization of boot layer, java.lang.module.FindException: Module my_dependency_1, ... not found, required by example).
My question is: Do I need to convert all my_dependencies_1, ... from non-modular to modular dependencies if I want to open and work with them along with my modular example project in my workspace, or is there any option that lets me keep working even with the non-modular dependency projects? I'm looking for a simple and clean solution and not for a "hack" with manually appending funky stuff to the startup arguments. If this is not possible I'd prefer to take some time to convert each dependency into a modular one with the drawback of being not usable anymore in other projects still written for Java 8.
Thanks for clarification :)
Here is a basic example for demonstration:
pom.xml (of project 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 (of project example)
package example;
import mydependency.MyDependency;
public class Example {
public static void main(String[] args) {
MyDependency.run();
}
}
module-info.java (of project example)
open module example {
requires mydependency;
}
pom.xml (of project 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 (of project mydependency)
package mydependency;
public class MyDependency {
public static void run() {
System.out.println("run");
}
}
Command line when running if project is closed (works properly):
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
Command line when running if project is opened (target/classes of mydependency is missing):
C:\me\jdk-11.0.1\bin\javaw.exe
-Dfile.encoding=UTF-8
-p "C:\me\workspace\example\target\classes"
-m example/example.Example
A source project cannot possibly be an automatic module, because the name of an automatic module is derived from the jar filename.
What you need is:
mvn install
in each dependencyMaven > Disable Workspace Resolution
on each project that depends on an automatic module (context menu in the Package Explorer)Edits: