Как вы программно подписываете jar-файлы на Java? - PullRequest
8 голосов
/ 07 октября 2011

Кто-нибудь делал это раньше?Единственная ссылка, которую я нашел в Google, была: 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

Ответы [ 4 ]

3 голосов
/ 19 июня 2014

Помните, что класс sun.security.tools.JarSigner написан для использования в качестве утилиты командной строки и не предназначен для вызова из кода Java.В результате обработка ошибок довольно резкая: код просто выведет сообщение об ошибке в стандартный формат и затем вызовет System.exit() 1 .

Это означает, что если вы вызываете классизнутри вашего Java-кода и при попытке подписать jar возникает ошибка, JVM, выполняющая ваш код, просто остановится.Это может быть хорошо в зависимости от вашей ситуации, но если ваш код долго работает или действует как служба, это не так хорошо.

Поэтому лучше вызывать инструмент jarsigner, используя ProcessBuilder, согласно комментарию зажима.Затем можно вызвать waitFor() для получающегося объекта Process и проверить exitValue(), чтобы увидеть, была ли команда успешной.getInputStream() позволит вам прочитать любые сообщения об ошибках, которые были записаны в стандартный формат, если операция не удалась.

3 голосов
/ 21 октября 2013

Чтобы учесть внезапное изменение ограничений безопасности в приложениях WebStart в Java 7u45, мы создали простой подписанный файл jar-файла . Он использует Guava 15 и модуль Bouncy Castle bcpkix. Он должен работать на Java 6 и 7. Он подходит только для небольших файлов. Используйте его для любых целей.

2 голосов
/ 22 июня 2012

В файле 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 находится в вашем classpath для компиляции и выполнения.

0 голосов
/ 07 октября 2011

Я использую задачу SingJar Ant (которая, по-видимому, вызывает инструмент командной строки внизу).Это можно назвать программно.

...