«Неверный файл подписи» при попытке запустить .jar - PullRequest
415 голосов
/ 16 июня 2009

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

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

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

Ответы [ 19 ]

2 голосов
/ 11 мая 2018

Если вы используете gradle, вот полная задача farJar:

version = '1.0'
//create a single Jar with all dependencies
task fatJar(type: Jar) {
    manifest {
        attributes 'Implementation-Title': 'Gradle Jar File Example',  
            'Implementation-Version': version,
            'Main-Class': 'com.example.main'
    }
    baseName = project.name + '-all'
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA' 
    with jar
}
2 голосов
/ 11 февраля 2017

Ошибка: произошла ошибка JNI, пожалуйста, проверьте вашу установку и попробуйте снова Исключение в потоке "main" java.lang.SecurityException: неверный дайджест файла подписи для основных атрибутов манифеста at sun.security.util.SignatureFileVerifier.processImpl (SignatureFileVerifier.java:314) at sun.security.util.SignatureFileVerifier.process (SignatureFileVerifier.java:268) в java.util.jar.JarVerifier.processEntry (JarVerifier.java:316) в java.util.jar.JarVerifier.update (JarVerifier.java:228) в java.util.jar.JarFile.initializeVerifier (JarFile.java:383) в java.util.jar.JarFile.getInputStream (JarFile.java:450) at sun.misc.URLClassPath $ JarLoader $ 2.getInputStream (URLClassPath.java:977) at sun.misc.Resource.cachedInputStream (Resource.java:77) at sun.misc.Resource.getByteBuffer (Resource.java:160) в java.net.URLClassLoader.defineClass (URLClassLoader.java:454) на java.net.URLClassLoader.access $ 100 (URLClassLoader.java:73) на java.net.URLClassLoader $ 1.run (URLClassLoader.java:368) на java.net.URLClassLoader $ 1.run (URLClassLoader.java:362) at java.security.AccessController.doPrivileged (собственный метод) на java.net.URLClassLoader.findClass (URLClassLoader.java:361) в java.lang.ClassLoader.loadClass (ClassLoader.java:424) at sun.misc.Launcher $ AppClassLoader.loadClass (Launcher.java:331) в java.lang.ClassLoader.loadClass (ClassLoader.java:357) at sun.launcher.LauncherHelper.checkAndLoadMain (LauncherHelper.java:495)

Что мне помогло (IntelliJ IDEA 2016.3): Файл -> Структура проекта -> Артефакты -> Добавить JAR -> Выбрать основной класс -> Выбрать «скопировать в выходной каталог и связать через манифест» -> ОК -> Применить -> Создать -> Создать артефакты ... -> Создать

2 голосов
/ 02 июня 2010

Сравните папку META-INF в новом jar со старым jar (до того, как вы добавили новые библиотеки). Возможно, что появятся новые файлы. Если да, вы можете удалить их. Это должно помочь. С Уважением, 999michal

1 голос
/ 04 августа 2018

Если вы ищете решение Fat JAR без распаковки или вмешательства в исходные библиотеки, но с помощью специального загрузчика классов JAR, посмотрите мой проект здесь .

Отказ от ответственности: я не писал код, просто упаковал его и опубликовал в Maven Central и описал в моем read-me, как его использовать.

Лично я использую его для создания исполняемых JAR-файлов Uber, содержащих зависимости BouncyCastle. Может быть, вам это тоже пригодится.

1 голос
/ 08 августа 2016

Стратегия будет заключаться в использовании ANT для упрощения удаления подписи из каждого файла Jar. Было бы выполнить следующие шаги:

  1. Копирование файла MANIFEST.MF во временный файл
  2. Извлечение записей Name и SHA из временного файла
  3. Создание временного файла Jar с временным манифестом
  4. Удаление временного манифеста
  5. Замена исходного файла Jar на временный

Вот макрос ANT , выполняющий работу:

<macrodef name="unsignjar" description="To unsign a specific Jar file">
    <attribute name="jarfile" 
        description="The jar file to unsign" />
    <sequential>
<!-- Copying to the temporary manifest file -->
        <copy toFile="@{jarFile}_MANIFEST.tmp">
            <resources>
                <zipentry zipfile="@{jarFile}" name="META-INF/MANIFEST.MF"/>
            </resources>
        </copy>
<!-- Removing the Name and SHA entries from the temporary file -->
        <replaceregexp file="@{jarFile}_MANIFEST.tmp" match="\nName:(.+?)\nSH" replace="SH" flags="gis" byline="false"/>
        <replaceregexp file="@{jarFile}_MANIFEST.tmp" match="SHA(.*)" replace="" flags="gis" byline="false"/>
<!-- Creating a temporary Jar file with the temporary manifest -->
        <jar jarfile="@{jarFile}.tmp"
            manifest="@{jarFile}_MANIFEST.tmp">
            <zipfileset src="@{jarFile}">
                <include name="**"/>
                <exclude name="META-INF/*.SF"/>
                <exclude name="META-INF/*.DSA"/>
                <exclude name="META-INF/*.RSA"/>
            </zipfileset>
        </jar>
<!-- Removing the temporary manifest -->
        <delete file="@{jarFile}_MANIFEST.tmp" />
<!-- Swapping the original Jar file with the temporary one -->
        <move file="@{jarFile}.tmp"
              tofile="@{jarFile}"
              overwrite="true" />
</sequential>

`

Определение можно затем назвать так в задаче ANT:

<target name="unsignJar">
    <unsignjar jarFile="org.test.myjartounsign.jar" />
</target>
1 голос
/ 13 декабря 2013

Возможно, что два разных подписчика испортили разум Java.

Попробуйте удалить папку META-INF из jar, добавить манифест и снова подписать JAR, мне помогло: http://jehy.ru/articles/2013/12/13/invalid-signature-file-digest-for-manifest-main-attributes/

0 голосов
/ 16 января 2019

У меня была такая же проблема в gradle при создании толстого Jar, обновление файла build.gradle с помощью строки исключения исправило проблему.

jar {
    from {
        configurations.compile.collect {
            it.isDirectory() ? it : zipTree(it)
        }
    }
    exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA'
    manifest {
        attributes 'Main-Class': 'com.test.Main'
    }
}
0 голосов
/ 02 августа 2010

У меня была похожая проблема. Причина была в том, что я компилировал с использованием JDK с JRE, отличным от стандартного в моем окне Windows.

Использование правильного java.exe решило мою проблему.

0 голосов
/ 23 сентября 2014

Если вы получаете это при попытке связать файлы JAR для проекта привязок Xamarin.Android, например:

JARTOXML: предупреждение J2XA006: ошибка отсутствующего класса возникла при отражении com.your.class: неверный дайджест файла подписи для основных атрибутов манифеста

Просто откройте файлы JAR с помощью Winzip и удалите каталоги meta-inf. Восстановить - работа выполнена

...