Hi, I'm trying to figure the intended process for compiling different versions of a class for a multi-release (MR) JAR if there is a module descriptor present.
I have these classes: --- src/main/java/com/example/Version.java package com.example; public class Version { private String value; String getValue() { return value; } public Version(String value) { this.value = value; } } --- --- src/main/java/com/example/A.java package com.example; public class A { public Version getVersion() { return new Version( "Java 8" ); } } --- --- src/main/java9/com/example/A.java package com.example; public class A { public Version getVersion() { return new Version( "Java 9" ); } } --- I.e. "Version" is common to all Java versions supported by the MR JAR, whereas there is one variant of "A" for Java 8 and one for Java 9. If I don't have a module descriptor things work fine: javac --source-path=src/main/java -d target/classes --release 8 $(find src/main/java -name "*.java") javac --source-path=src/main/java9 -cp target/classes -d target/classes-java9 --release 9 $(find src/main/java9 -name "*.java") jar --create --file mr.jar -C target/classes . --release 9 -C target/classes-java9 . Specifically, the second javac call picks up the (shared) class file for "Version" from the classpath by pointing to the output directory of the first compilation. Things fail when adding a module descriptor: --- src/main/java9/module-info.java module com.example { } --- Now the second javac call fails: src/main/java9/com/example/A.java:4: error: cannot find symbol public Version getVersion() { return new Version( "Java 9" ); } ^ symbol: class Version location: class A It seems as if the presence of module-info.java suppresses the configured classpath. Reading JEP 261 [1] I assumed this should be supported: "It is possible to put arbitrary classes and JAR files on the class path in [Single-module mode]", which I think is what I have here. Am I running into a bug? Or am I on the wrong track here and creating such MR JAR should be done differently? If so, how should classes that are meant to go into META-INF/versions/9 be compiled without re-compiling all the shared classes? Thanks for any pointers, --Gunnar [1] http://openjdk.java.net/jeps/261