Вопрос-ответ

"Invalid signature file" when attempting to run a .jar

"Недопустимый файл подписи" при попытке запустить .jar

Моя программа на Java упакована в файл jar и использует внешнюю библиотеку jar, bouncy castle. Мой код компилируется нормально, но запуск jar приводит к следующей ошибке:

Исключение в потоке "main" java.lang.Исключение SecurityException: неверный дайджест файла подписи для основных атрибутов манифеста

Я больше часа гуглил в поисках объяснения и нашел очень мало полезного. Если кто-нибудь видел эту ошибку раньше и мог предложить некоторую помощь, я был бы признателен.

Переведено автоматически
Ответ 1

Для тех, кто получил эту ошибку при попытке создать заштрихованный uber-jar с maven-shade-plugin помощью, решение состоит в том, чтобы исключить файлы подписи манифеста, добавив следующие строки в конфигурацию плагина:

<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<!-- Additional configuration. -->
</configuration>
Ответ 2

Для тех, кто использует gradle и пытается создать и использовать fat jar, может помочь следующий синтаксис.

jar {
doFirst {
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}
exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA'
}
Ответ 3

Пожалуйста, используйте следующую команду

zip -d yourjar.jar 'META-INF/*.SF' 'META-INF/*.RSA' 'META-INF/*.DSA'
Ответ 4

Некоторые из ваших зависимостей, вероятно, являются подписанными файлами jar. Когда вы объединяете их все в один большой jar-файл, соответствующие файлы подписи все еще присутствуют и больше не соответствуют "большому объединенному" jar-файлу, поэтому среда выполнения останавливается, думая, что файл jar был изменен (что ... так сказать, есть).

Предполагая, что вы используете ant, вы можете решить проблему, удалив файлы подписи из ваших зависимостей jarfile. К сожалению, в ant это невозможно сделать за один шаг.

Тем не менее, я смог заставить это работать с Ant в два этапа, не называя конкретно каждую зависимость jarfile, используя:

<target name="jar" depends="compile" description="Create one big jarfile.">
<jar jarfile="${output.dir}/deps.jar">
<zipgroupfileset dir="jars">
<include name="**/*.jar" />
</zipgroupfileset>
</jar>
<sleep seconds="1" />
<jar jarfile="${output.dir}/myjar.jar" basedir="${classes.dir}">
<zipfileset src="${output.dir}/deps.jar" excludes="META-INF/*.SF" />
<manifest>
<attribute name="Main-Class" value="com.mycompany.MyMain" />
</manifest>
</jar>
</target>

Предполагается, что элемент sleep предотвращает ошибки о файлах с датами изменения в будущем.

Другие варианты, которые я нашел в связанных потоках, у меня не сработали.

java jar