创建多版本 jar 时出错 "entry: A.class, contains a class with internal name com.vipin.exp.A, names do not match"

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

这里 java9/com/vipin/exp/A.class 是我想与 jdk 9 和其他版本 java8/com/vipin/exp/A.class 一起使用的文件。为此,我正在尝试创建多版本 jar 但出现以下错误。这个命令有什么问题?

XXXX@XXX-MacBook-Air.local:~/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

我的目录结构是:

XXXX@XXX-MacBook-Air.local:~/javacode$ tree
.
|____java8
| |____com
| | |____vipin
| | | |____exp
| | | | |____A.class
| | | | |____A.java
|____java9
| |____com
| | |____vipin
| | | |____exp
| | | | |____A.class
| | | | |____A.java

当我只使用一个 class 文件来创建 jar 时效果很好,如下所示

XXXX@XXX-MacBook-Air.local:~/javacode$ jar -c -f vipin.jar -C java8/com/vipin/exp/ .
XXXX@XXX-MacBook-Air.local:~/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
XXXX@XXX-MacBook-Air.local:~/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

我对-C选项的理解是错误的,我应该在-C之后给出顶级目录。

XXXX@XXX-MacBook-Air.local:~/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
XXXX@XXX-MacBook-Air.local:~/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

上面给出的命令产生了错误的输出,下面是正确的输出,您可以在 tvf 输出中看到 class 文件以正确的结构 com/vipin/exp/A.class

XXXX@XXX-MacBook-Air.local:~/javacode$ jar -c -f vipin_test.jar -C java8 .
XXXX@XXX-MacBook-Air.local:~/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

一些更多的命令来证明它工作得很好。

XXXX@XXX-MacBook-Air.local:~/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)
XXXX@XXX-MacBook-Air.local:~/javacode$ java -cp vipin.jar com.vipin.exp.A
Inside java9 version
XXXX@XXX-MacBook-Air.local:~/javacode$ /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/bin/java -version
java version "1.8.0_111"
XXXX@XXX-MacBook-Air.local:~/javacode$ /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/bin/java -cp vipin.jar com.vipin.exp.A
Inside java8 version