Search code examples
javajarjava-9multi-release-jar

Error while creating multi release jar "entry: A.class, contains a class with internal name com.vipin.exp.A, names do not match"


Here java9/com/vipin/exp/A.class is file I want to use with jdk 9 and for other versions java8/com/vipin/exp/A.class. For this I am trying to create multi release jar but getting below error. What is wrong in this command ?

[email protected]:~/javacode$ pwd
    /Users/XXXX/javacode
XXXX@XXX-Air:~/javacode$ javac --release 9 -d /Users/nitinkumarsharma/javacode/java9/ java9/com/vipin/exp/A.java
XXXX@XXX-Air:~/javacode$ javac --release 8 -d /Users/nitinkumarsharma/javacode/java8/ java8/com/vipin/exp/A.java
XXXX@XXX-Air:~/javacode$ jar -c -f vipin.jar -C java8/com/vipin/exp/ . --release 9 -C java9/com/vipin/exp/ .

        entry: A.class, contains a class with internal name com.vipin.exp.A, names do not match
        entry: META-INF/versions/9/A.class, contains a new public class not found in base entries
        Warning: entry META-INF/versions/9/A.java, multiple resources with same name
        invalid multi-release jar file vipin.jar deleted

My directory structure is:

[email protected]:~/javacode$ tree
.
|____java8
| |____com
| | |____vipin
| | | |____exp
| | | | |____A.class
| | | | |____A.java
|____java9
| |____com
| | |____vipin
| | | |____exp
| | | | |____A.class
| | | | |____A.java

It works well when I use only one class file to create jar, like below

[email protected]:~/javacode$ jar -c -f vipin.jar -C java8/com/vipin/exp/ .
[email protected]:~/javacode$ ls -ltr
total 12688
drwxr-xr-x  3 XXXX  staff      102 Oct 17 18:02 java8
drwxr-xr-x  3 XXXX  staff      102 Oct 17 20:00 java9
-rw-r--r--  1 XXXX  staff      968 Oct 18 17:05 vipin.jar
[email protected]:~/javacode$ jar -tvf vipin.jar 
     0 Wed Oct 18 17:05:08 IST 2017 META-INF/
    61 Wed Oct 18 17:05:08 IST 2017 META-INF/MANIFEST.MF
   430 Tue Oct 17 22:55:22 IST 2017 A.class
   136 Tue Oct 17 22:49:20 IST 2017 A.java

Solution

  • My understanding of -C option was wrong, I should have given top level directory after -C.

    [email protected]:~/javacode$ jar -c -f vipin.jar -C java8 . --release 9 -C java9 .
    Warning: entry META-INF/versions/9/com/vipin/exp/A.java, multiple resources with same name
    [email protected]:~/javacode$ jar -tvf vipin.jar 
         0 Wed Oct 18 19:06:26 IST 2017 META-INF/
        82 Wed Oct 18 19:06:26 IST 2017 META-INF/MANIFEST.MF
         0 Tue Oct 17 18:02:04 IST 2017 com/
         0 Tue Oct 17 18:02:04 IST 2017 com/vipin/
         0 Tue Oct 17 23:26:56 IST 2017 com/vipin/exp/
       430 Wed Oct 18 19:00:38 IST 2017 com/vipin/exp/A.class
       136 Tue Oct 17 22:49:20 IST 2017 com/vipin/exp/A.java
         0 Tue Oct 17 20:00:34 IST 2017 META-INF/versions/9/
         0 Tue Oct 17 20:00:34 IST 2017 META-INF/versions/9/com/
         0 Tue Oct 17 20:00:34 IST 2017 META-INF/versions/9/com/vipin/
         0 Tue Oct 17 23:27:04 IST 2017 META-INF/versions/9/com/vipin/exp/
       430 Wed Oct 18 19:02:04 IST 2017 META-INF/versions/9/com/vipin/exp/A.class
       135 Tue Oct 17 22:49:26 IST 2017 META-INF/versions/9/com/vipin/exp/A.java
    

    The command worked given in question above produced wrong output, correct one would be below and you can see in tvf output the class file is available in correct structure com/vipin/exp/A.class

    [email protected]:~/javacode$ jar -c -f vipin_test.jar -C java8 .
    [email protected]:~/javacode$ jar -tvf vipin_test.jar
         0 Wed Oct 18 19:20:18 IST 2017 META-INF/
        61 Wed Oct 18 19:20:18 IST 2017 META-INF/MANIFEST.MF
         0 Tue Oct 17 18:02:04 IST 2017 com/
         0 Tue Oct 17 18:02:04 IST 2017 com/vipin/
         0 Tue Oct 17 23:26:56 IST 2017 com/vipin/exp/
       430 Wed Oct 18 19:00:38 IST 2017 com/vipin/exp/A.class
       136 Tue Oct 17 22:49:20 IST 2017 com/vipin/exp/A.java
    

    Some more commands to show it worked perfectly.

    [email protected]:~/javacode$ java -version
    java version "9"
    Java(TM) SE Runtime Environment (build 9+181)
    Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)
    [email protected]:~/javacode$ java -cp vipin.jar com.vipin.exp.A
    Inside java9 version
    [email protected]:~/javacode$ /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/bin/java -version
    java version "1.8.0_111"
    [email protected]:~/javacode$ /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/bin/java -cp vipin.jar com.vipin.exp.A
    Inside java8 version