2011-10-07 93 views
8

有沒有人做過這個?我已經在谷歌發現的唯一參考一直是:http://onjava.com/onjava/2001/04/12/signing_jar.html仍然採用太陽*這會導致一些問題類...你如何以編程方式在Java中籤署jar文件?

發現這個爲好,但不與java16工作:https://svn.cs.cf.ac.uk/projects/whip/trunk/whip-core/src/main/java/org/whipplugin/data/bundle/JarSigner15.java

+2

你可以在java中調用jar簽名者進程。最好使用ProcessBuilder。 – clamp

回答

0

我使用SingJar Ant task(顯然在下面調用命令行工具)。應該可以通過編程來調用它。

+0

正在尋找一些不叫'jarsigner'的東西 - 全部都是在java中完成的... – wuntee

+1

@wuntee:我懷疑如果它很容易實現,那麼Ant會採用這種方法。 –

2

在tools.jar文件中是類sun.security.tools.JarSigner,它具有靜態運行(ava.lang.String []字符串)方法,該方法採用與jarsigner可執行文件相同的參數。

所以,你可以調用類似:

sun.security.tools.JarSigner.run(new String[] { 
    "-keystore", keystoreFile.getAbsolutePath(), 
    "-storepass", keystorePassword, 
    outFile.getAbsolutePath(), 
    keystoreAlias 
}); 

你需要確保的tools.jar在classpath中編譯和執行。

3

爲了解決Java 7u45中WebStart應用程序中安全限制的突然變化,我們創建了一個simple signed jar file generator。它使用Guava 15和Bouncy Castle bcpkix模塊。它應該在Java 6上運行& 7.它僅適用於小文件。將它用於任何你想要的目的。

3

請注意,sun.security.tools.JarSigner類被編寫爲用作命令行實用程序,而不是從Java代碼調用的。因此,錯誤處理非常突兀:代碼將簡單地將錯誤消息打印出來,然後調用System.exit()1

這意味着如果您從Java代碼中調用該類,並在嘗試簽名jar時發生錯誤,則運行代碼的JVM將會停止。根據你的情況,這可能會很好,但是如果你的代碼長時間運行或者作爲服務運行,那就不是那麼好。

因此,最好使用ProcessBuilder根據註釋的註釋調用jarsigner工具。然後您可以在生成的過程對象上調用waitFor(),並檢查exitValue()以查看命令是否成功。 getInputStream()將允許您讀取操作失敗時寫入標準輸出的任何錯誤消息。

相關問題