你如何以编程方式在Java中签署jar文件?

时间:2011-10-07 14:29:03

标签: java jar sign

以前有人这样做过吗?我在谷歌上找到的唯一参考是:http://onjava.com/onjava/2001/04/12/signing_jar.html仍然使用sun。*类会导致问题......

也发现了这一点,但不适用于java16:https://svn.cs.cf.ac.uk/projects/whip/trunk/whip-core/src/main/java/org/whipplugin/data/bundle/JarSigner15.java

5 个答案:

答案 0 :(得分:3)

为了解决Java 7u45中WebStart应用程序中安全限制的突然变化,我们创建了一个simple signed jar file generator。它使用Guava 15和Bouncy Castle bcpkix模块。它应该在Java 6& 7.仅适用于小文件。将它用于任何你想要的目的。

答案 1 :(得分:3)

请注意,sun.security.tools.JarSigner类被编写为用作命令行实用程序,并且不能从Java代码中调用。因此,错误处理非常突然:代码只会将错误消息打印到标准输出,然后调用System.exit() 1

这意味着如果从Java代码中调用该类,并且在尝试对jar进行签名时发生错误,则运行代码的JVM将停止运行。这可能会很好,具体取决于您的情况,但如果您的代码长期运行或作为服务,它就不太好。

因此,根据clamp的评论,使用ProcessBuilder调用jarsigner工具会更好。然后,您可以在生成的Process对象上调用waitFor()并检查exitValue()以查看命令是否成功。如果操作失败,getInputStream()将允许您读取写入标准输出的任何错误消息。

答案 2 :(得分:2)

在tools.jar文件中是类sun.security.tools.JarSigner,它具有静态运行(ava.lang.String [] strings)方法,该方法采用与jarsigner可执行文件相同的参数。

所以你可以打电话给:

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

您需要确保tools.jar位于类路径中以进行编译和执行。

答案 3 :(得分:1)

以下是使用 JDK 9 及更高版本执行此操作的方法:

<img />

答案 4 :(得分:0)

我正在使用SingJar Ant task(显然是在下面调用命令行工具)。应该可以以编程方式调用它。