2017-08-04 29 views
4

我想通過jar命令創建多版本jar(對於Java 8和Java 9)。 有幾個Netbeans IDE項目:com.jdojo.mrjar.jdk8,com.jdojo.mrjar.jdk9。 項目源代碼是here。 使用命令行我轉到父文件夾並運行命令。 當我嘗試這樣做:如何創建多版本jar並過濾輸入內容?

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) 

我認爲這是由於開發環境服務文件的存在。是否有可能對它們進行過濾(僅選擇特定文件類型的文件以便通過jar包裝它們)?


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

+1

您是否嘗試過明確列出'class'文件而不是使用'-C'?這樣你可以看到排除'.netbeans ...'文件夾是否有幫助。另外,有趣的是,這些只是警告,所以可能與例外無關。那裏沒有原因嗎? – Nicolai

+0

是的,@Nicolai。 「類」文件列表解決了過濾問題。我認爲'$(find -name * .class)'命令對此很有用。但是這樣做還有其他問題。沒有辦法指定源代碼文件列表的根文件夾在哪裏。 –

+0

因此,發生錯誤的文件打包('com.jdojo.mrjar.jdk9.build.classes.com.jdojo.mrjar')。 –

回答

3

有命令的最短全序列:

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

也許,可能會有一個較短的解決方案。