以前有人这样做过吗?我在谷歌上找到的唯一参考是: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
答案 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(显然是在下面调用命令行工具)。应该可以以编程方式调用它。