如何创建多版本 jar 和过滤输入内容?

How to create multi-release jar and filtering input content?

我想通过 jar 命令创建多版本 jar(针对 Java 8 和 Java 9)。 有几个 Netbeans IDE 项目:com.jdojo.mrjar.jdk8、com.jdojo.mrjar.jdk9。 项目源代码是 here。 使用命令行我转到父文件夹和 运行 命令。 当我尝试这样做时:

jar --create --file mrjars/com.jdojo.mrjar.jar
    -C com.jdojo.mrjar.jdk8/build/classes .
    --release 9 -C com.jdojo.mrjar.jdk9/build/classes .

我收到一条消息:

Warning: entry META-INF/versions/9/.netbeans_automatic_build contains a class that
is identical to an entry already in the jar
Warning: entry META-INF/versions/9/.netbeans_update_resources contains a class that
is identical to an entry already in the jar
java.nio.file.NoSuchFileException: java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:85)
        at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103)
        at java.base/sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:384)
        at java.base/sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:288)
        at java.base/java.nio.file.Files.move(Files.java:1413)
        at jdk.jartool/sun.tools.jar.Main.validateAndClose(Main.java:460)
        at jdk.jartool/sun.tools.jar.Main.run(Main.java:343)
        at jdk.jartool/sun.tools.jar.Main.main(Main.java:1670)

我认为这是由于开发环境服务文件的存在。有没有可能过滤它们(select只有某种文件类型的文件用jar打包)?


Java Platform, Standard Edition Tools Reference中描述的jar操作。

有最短的完整命令序列:

cd com.jdojo.mrjar.jdk8/build/classes && jar -c -f com.jdojo.mrjar.jar $(find -name *.class) && cd ../../.. && mv -f com.jdojo.mrjar.jdk8/build/classes/com.jdojo.mrjar.jar -t com.jdojo.mrjar.jdk9/build/classes  && cd com.jdojo.mrjar.jdk9/build/classes  && jar -u -f com.jdojo.mrjar.jar --release 9 $(find -name *.class) && cd ../../.. && mv -f com.jdojo.mrjar.jdk9/build/classes/com.jdojo.mrjar.jar -t com.jdojo.mrjar.jdk9/mrjars

命令执行的分步说明

  1. 转到 "com.jdojo.mrjar.jdk8/build/classes" 文件夹:
    cd com.jdojo.mrjar.jdk8/build/classes
  2. 运行 jar命令在这个地方:
    jar -c -f com.jdojo.mrjar.jar $(find -name *.class)
  3. 返回:
    cd ../../..
  4. 将创建的 jar 文件移动到其他文件夹:
    mv -f com.jdojo.mrjar.jdk8/build/classes/com.jdojo.mrjar.jar -t com.jdojo.mrjar.jdk9/build/classes
  5. 转到此文件夹:
    cd com.jdojo.mrjar.jdk9/build/classes
  6. 正在更新移动的 jar 文件:
    jar -u -f com.jdojo.mrjar.jar --release 9 $(find -name *.class)
  7. 返回:
    cd ../../..
  8. 正在将更新的 jar 文件移动到目标文件夹:
    mv -f com.jdojo.mrjar.jdk9/build/classes/com.jdojo.mrjar.jar -t com.jdojo.mrjar.jdk9/mrjars

也许,可能有更短的解决方案。