FWIW - this was reported by one of Quarkus project users here https://github.com/quarkusio/quarkus/issues/5359
-Jaikiran On 18/11/19 8:31 PM, Jaikiran Pai wrote: > Imagine 2 jar files. One called helloworld.jar which contains just a > single org.myapp.HelloWorld class which prints to System.out from its > main method. The other jar called manifest-cp-test.jar. This > manifest-cp-test.jar contains (only a) META-INF/MANIFEST.MF with the > following content: > > Manifest-Version: 1.0 > Class-Path: /C:/helloworld.jar > Main-Class: org.myapp.HelloWorld > > So this manifest-cp-test.jar has a Main-Class entry which points to the > HelloWorld class that belongs in the other helloworld.jar file. Both the > helloworld.jar and the manifest-cp-test.jar reside at C:\ on a Windows > system. > > When run using Java 11, this runs correctly and prints the HelloWorld > message: > > C:\>jdk-11.0.2\bin\java -jar manifest-cp-test.jar > Hello World > > > However, when run using Java 13 (and even latest upstream Java 14) on > the same Windows system, this now runs into a ClassNotFoundException: > > Java 13: > > C:\>jdk-13.0.1\bin\java -jar manifest-cp-test.jar > Error: Could not find or load main class org.myapp.HelloWorld > Caused by: java.lang.ClassNotFoundException: org.myapp.HelloWorld > > > Java 14: > > C:\>jdk-14\bin\java -jar manifest-cp-test.jar > Error: Could not find or load main class org.myapp.HelloWorld > Caused by: java.lang.ClassNotFoundException: org.myapp.HelloWorld > > > Adding the "-Djdk.net.URLClassPath.showIgnoredClassPathEntries=true" > debug flag to the java launch command shows: > > C:\>jdk-13.0.1\bin\java > -Djdk.net.URLClassPath.showIgnoredClassPathEntries=true > -jar manifest-cp-test.jar > Class-Path entry: "/C:/helloworld.jar" ignored in JAR file > file:/C:/manifest-cp- > test.jar > Error: Could not find or load main class org.myapp.HelloWorld > Caused by: java.lang.ClassNotFoundException: org.myapp.HelloWorld > > So this Class-Path entry is being ignored starting Java 13. > > I compared the spec for Class-Path entry for Java 11[1] and Java 13[2] > and I do changes in that section. The Java 13 version doc has those 3 > rules mentioned under "A Class-Path entry is valid if the following > conditions are true:". So all 3 rules should be satisfied? I guess that > then means that this style of Class-Path entry will not satisfy the "It > can be used to create a URL, by resolving it against the context JAR's > URL"? I haven't yet had the time to look into the code or read up a bit > more on what this rule actually means. Specifically what does resolve > mean here? > > [1] > https://docs.oracle.com/en/java/javase/11/docs/specs/jar/jar.html#class-path-attribute > > [2] > https://docs.oracle.com/en/java/javase/13/docs/specs/jar/jar.html#class-path-attribute > > P.S: This is another case of Class-Path semantics which behave not just > differently in different versions of Java but different in different > subsystems of the same Java version itself. More about this has been > discussed recently in > https://mail.openjdk.java.net/pipermail/compiler-dev/2019-October/013766.html > on compiler-dev. > > -Jaikiran >