Доброго времени суток! Я только начал изучать JavaFX и столкнулся с проблемой: проект в IntelliJ IDEA запускается нормально — все функции работают, но после сборки в .jar файл приложение не запускается. При попытке запустить .jar из командной строки появляется ошибка: <br/> <br/> Error: A JNI error has occurred, please check your installation and try again <br/> Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes <br/> at java.base/sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:339) <br/> at java.base/sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:281) <br/> at java.base/java.util.jar.JarVerifier.processEntry(JarVerifier.java:320) <br/> at java.base/java.util.jar.JarVerifier.update(JarVerifier.java:232) <br/> at java.base/java.util.jar.JarFile.initializeVerifier(JarFile.java:760) <br/> at java.base/java.util.jar.JarFile.ensureInitialization(JarFile.java:1070) <br/> at java.base/java.util.jar.JavaUtilJarAccessImpl.ensureInitialization(JavaUtilJarAccessImpl.java:42) <br/> at java.base/jdk.internal.loader.URLClassPath$JarLoader$2.getManifest(URLClassPath.java:841) <br/> at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:848) <br/> at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760) <br/> at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681) <br/> at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639) <br/> at java.base/jdk. <br/> <br/> Что может быть причиной этой ошибки и как исправить сборку/настройки, чтобы .jar корректно запускался вне IDE?
Коротко — причина не в JavaFX как таковом, а в подписи библиотек, которые вы “упаковали” внутрь одного jar. Ошибка
Invalid signature file digest for Manifest main attributes
означает, что в итоговом jar остались файлы подписи (META-INF/*.SF, *.RSA, *.DSA и т.п.), которые перестали соответствовать содержимому (в процессе объединения/перезаписи классов/ресурсов подпись стала неверной). JVM при загрузке проверяет подписи и выкидывает SecurityException.
Что можно сделать (варианты решения)
1) Не делать “uber‑jar” с включёнными подписи‑файлами
- Самый простой путь — не объединять подписанные Jar’ы в один без удаления их META-INF подписи. Распространённый сценарий: вы использовали сборку “jar с зависимостями” (IntelliJ artifact / shade / shadow), в результате в META-INF оказались *.SF/*.RSA.
- Проверьте содержимое jar: unzip -l app.jar | grep META-INF
2) Удалить файлы подписи при сборке
- Maven Shade:
Добавьте filter, который исключит файлы подписи:
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
- Gradle Shadow:
shadowJar {
exclude 'META-INF/*.SF'
exclude 'META-INF/*.DSA'
exclude 'META-INF/*.RSA'
// возможно, тоже exclude 'META-INF/INDEX.LIST'
}
- Если вы собрали jar вручную через IntelliJ: либо пересоберите без включения подписи, либо после сборки удалите их:
zip -d app.jar 'META-INF/*.SF' 'META-INF/*.RSA' 'META-INF/*.DSA'
3) Другой вариант — не упаковывать JavaFX библиотеки в jar, а запускать с module‑/class‑path
- Для Java 11+ JavaFX не включена в JDK. Если вы не упаковали библиотеки, при запуске извне нужно указывать модуль‑путь:
java --module-path /path/to/javafx/lib --add-modules javafx.controls,javafx.fxml -jar app.jar
- Либо использовать jlink/jpackage, чтобы собрать runtime с JavaFX — это 추천 для распространения.
4) Альтернативы: сохранить оригинальные подписанные JAR как отдельные файлы (в кач. зависимостей), а не распаковывать их в один jar.
Небольшая проверка/диагностика
- Посмотрите список файлов META-INF в jar. Если там *.SF/*.RSA — проблема именно в этом.
- Если их нет, и вы всё ещё видите ошибку, проверьте, что вы запускаете тот же JDK, с которым совместимы зависимости (иногда “JNI error” — общее сообщение для проблем загрузки классов).
Резюме: удалите/исключите файлы подписи из собранного uber‑jar или используйте другой способ упаковки (отдельные зависимости, jlink/jpackage). Если дадите ваш build.gradle / pom.xml или конфигурацию артефакта в IntelliJ, я покажу точные правки.
Первая же ссылка из поисковика, там же расписано и решение: <br/> <blockquote>Ошибка "Invalid signature file digest for Manifest main attributes" возникает при нарушении целостности цифровой подписи JAR-файла. В корне проблема связана с механизмом безопасности Java, который проверяет цифровые подписи для подтверждения аутентичности и целостности кода.<br/> <br/> JAR-файлы часто подписываются цифровыми сертификатами для гарантии того, что код не был изменен после создания. Эта информация хранится в каталоге META-INF, который содержит следующие ключевые файлы:<br/> <br/> MANIFEST.MF — содержит метаданные о файлах в архиве<br/> .SF — файлы подписи, содержащие хеш-значения файлов<br/> .DSA, .RSA — файлы с цифровыми подписями<br/> Когда вы пытаетесь запустить JAR-файл, JVM проверяет соответствие между этими файлами. Если обнаруживается несоответствие — появляется ошибка Invalid signature file.</blockquote> <br/> <a href="https://sky.pro/wiki/media/reshenie-problemy-invalid-signature-file-pri-zapuske-jar-fajla/" rel="nofollow">https://sky.pro/wiki/media/reshenie-problemy-inval...</a>
<a href="https://ru.stackoverflow.com/a/787102/204271" rel="nofollow">https://ru.stackoverflow.com/a/787102/204271</a>