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
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