Моя java-программа упакована в jar-файл и использует внешнюю jar-библиотеку bouncy castle . Мой код компилируется нормально, но запуск jar приводит к следующей ошибке:
Исключение в потоке "main" java.lang.SecurityException: неверный дайджест файла подписи для основных атрибутов манифеста
Я более часа гуглял в поисках объяснения и нашел очень мало пользы. Если бы кто-то видел эту ошибку раньше и мог бы предложить некоторую помощь, я был бы обязан.
Ответы:
Решение, перечисленное здесь, может предоставить указатель.
Нижняя граница :
источник
Для тех, кто получил эту ошибку при попытке создать Uber-JAR с
maven-shade-plugin
, решение состоит в том, чтобы исключить файлы подписи манифеста, добавив следующие строки в конфигурацию плагина:источник
Для тех, кто использует gradle и пытается создать и использовать толстый jar, следующий синтаксис может помочь.
источник
exclude
своюfatJar
задачу, которая имела этуconfigurations.compile.collect
команду. См. Stackoverflow.com/a/31426413/103412Error: Could not find or load main class App Caused by: java.lang.ClassNotFoundException: App
Некоторые из ваших зависимостей, вероятно, являются подписанными jarfiles. Когда вы объединяете их в один большой jar-файл, соответствующие файлы сигнатур по-прежнему присутствуют и больше не соответствуют «большому объединенному» jar-файлу, поэтому среда выполнения останавливается, думая, что файл jar был подделан (что ... разговаривать).
Вы можете решить эту проблему, удалив файлы сигнатур из ваших зависимостей jarfile. К сожалению, это невозможно сделать за один шаг в муравье .
Тем не менее, я смог получить эту работу с Ant в два этапа, без особого именования каждой зависимости jarfile, используя:
Предполагается, что спящий элемент предотвращает ошибки в файлах с датами изменения в будущем .
Другие варианты, которые я нашел в связанных темах, не работали для меня.
источник
Пожалуйста, используйте следующую команду
источник
У меня была эта проблема при использовании IntelliJ IDEA 14.01.
Я смог это исправить:
Файл-> Структура проекта-> Добавить новый (Артефакты) -> jar-> Из модулей с зависимостями в окне Создать Jar из модуля:
Выберите свой основной класс
Файл JAR из библиотек. Выберите копию в выходной каталог и ссылку через манифест.
источник
Безопасность - это уже сложная тема, но я разочарован тем, что самым популярным решением является удаление сигнатур безопасности. JCE требует эти подписи . Maven shade использует файл Jar BouncyCastle, который помещает подписи в META-INF, но подписи BouncyCastle недопустимы для нового uber-jar (только для jar BC), и именно это вызывает ошибку недопустимой подписи в этом потоке ,
Да, исключение или удаление подписей в соответствии с предложением @ruhsuzbaykus действительно исключает исходную ошибку, но может также привести к новым, загадочным ошибкам:
Явно указав, где найти алгоритм, вот так:
Я смог получить другую ошибку:
JCE не может аутентифицировать провайдера, потому что мы удалили криптографические подписи , следуя предложению в другом месте в этой же теме .
Решением, которое я нашел, был плагин исполняемого упаковщика, который использует подход jar-in-jar для сохранения подписи BouncyCastle в одном исполняемом jar.
ОБНОВЛЕНИЕ :
Еще один способ сделать это (правильный путь?) - использовать подписчик Maven Jar . Это позволяет вам продолжать использовать тени Maven без ошибок безопасности. ОДНАКО, у вас должен быть сертификат подписи кода (Oracle предлагает поискать «Сертификат подписи кода Java»). Конфигурация POM выглядит следующим образом:
Нет, у JCE нет способа распознать самоподписанный сертификат, поэтому, если вам нужно сохранить сертификаты BouncyCastle, вы должны либо использовать плагин jar-in-jar, либо получить сертификат JCE.
источник
Я столкнулся с той же проблемой, после ссылки где-то это работало, как показано ниже:
источник
maven-shade-plugin
теге.Предполагая, что вы создаете свой jar-файл с помощью ant, вы можете просто дать команду ant пропустить директорию META-INF. Это упрощенная версия моей цели:
источник
Я недавно начал использовать IntelliJ в своих проектах. Тем не менее, некоторые из моих коллег все еще используют Eclipse в тех же проектах. Сегодня я получил ту же ошибку после выполнения jar-файла, созданного моим IntelliJ. Хотя все решения, о которых здесь говорится, говорят об одном и том же, ни одно из них не сработало для меня легко (возможно, из-за того, что я не использую ANT, сборка maven вызвала у меня другие ошибки, которые привели меня к http://cwiki.apache.org/ confluence / display / MAVEN / MojoExecutionException , а также я не мог понять, что такое подписанные банки самостоятельно!)
Наконец это помогло мне
Угадай, что было удалено из моего фляги ?!
Кажется, что проблема была связана с некоторыми файлами, относящимися к затмению.
источник
У меня была такая же проблема
gradle
при создании толстого Jar, обновлениеbuild.gradle
файла с помощью строки исключения исправило проблему.источник
Если вы используете gradle, вот полная задача farJar:
источник
Сравните папку META-INF в новом jar со старым jar (до добавления новых библиотек). Возможно, что появятся новые файлы. Если да, вы можете удалить их. Это должно помочь. С уважением, 999michal
источник
Стратегия будет заключаться в использовании ANT для упрощения удаления подписи из каждого файла Jar. Было бы выполнить следующие шаги:
Вот макрос ANT, выполняющий эту работу:
`
Затем определение можно назвать так в задаче ANT:
источник
Что мне помогло (IntelliJ IDEA 2016.3): Файл -> Структура проекта -> Артефакты -> Добавить JAR -> Выбрать основной класс -> Выбрать "скопировать в выходной каталог и связать через манифест" -> ОК -> Применить -> Построить - > Построить артефакты ... -> Построить
источник
Вполне возможно, что два разных подписчика испортили разум Java.
Попробуйте удалить папку META-INF из jar, добавить манифест и снова подписать JAR, это мне помогло: http://jehy.ru/articles/2013/12/13/invalid-signature-file-digest-for-manifest-main- атрибуты /
источник
Если вы ищете решение Fat JAR без распаковки или изменения оригинальных библиотек, но со специальным загрузчиком классов JAR, взгляните на мой проект здесь .
Отказ от ответственности: я не писал код, просто упаковал его и опубликовал в Maven Central и описал в своей статье о том, как его использовать.
Я лично использую его для создания исполняемых UAR JAR-файлов, содержащих зависимости BouncyCastle. Может быть, это тоже полезно для вас.
источник
Для тех, у кого проблемы с принятым решением, есть другой способ исключить ресурс из затененной банки с помощью DontIncludeResourceTransformer:
https://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#DontIncludeResourceTransformer
От Shade 3.0 этот преобразователь принимает список ресурсов. Перед этим вам просто нужно использовать несколько трансформаторов, каждый с одним ресурсом.
источник
Это случилось со мной в Intellij, когда я нажал «Добавить как проект Maven» в нижней строке, когда Intellij сказал «Обнаружены неуправляемые файлы pom». Между тем, папка уже была создана. Так что он не получил последние изменения.
Удаление папки и запуск программы решили проблему для меня. папка была затем воссоздана.
Смотрите также ответ Little Fox. Ошибка, которую я получил, была очень похожа на его.
источник
У меня была аналогичная проблема. Причина была в том, что я компилировал с использованием JDK с JRE, отличным от стандартного в моем окне Windows.
Использование правильного java.exe решило мою проблему.
источник
Если вы получаете это при попытке связать файлы JAR для проекта привязок Xamarin.Android, например:
Просто откройте файлы JAR с помощью Winzip и удалите каталоги meta-inf. Перестроить - работа выполнена
источник