2011-10-07 74 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()将允许您读取操作失败时写入标准输出的任何错误消息。

相关问题