Приложение JavaFX с цифровой подписью, выдающее java.lang.NoClassDefFoundError: org/bouncycastle/cert/X509CertificateHolJAVA

Программисты JAVA общаются здесь
Anonymous
Приложение JavaFX с цифровой подписью, выдающее java.lang.NoClassDefFoundError: org/bouncycastle/cert/X509CertificateHol

Сообщение Anonymous »

У меня возникли проблемы с библиотекой BouncyCastle при попытке подписать документ цифровой подписью с помощью приложения, созданного с помощью JavaFX. Ошибка появляется ТОЛЬКО тогда, когда я подписываю скомпилированный образ приложения. Если я запускаю приложение через свою IDE (Intellij Idea), оно работает отлично. Может быть, что-то происходит, когда я компилирую образ, который не отображает правильные зависимости?
Вот соответствующие фрагменты кода:
Зависимости в build.gradle:

Код: Выделить всё

dependencies {
implementation('org.controlsfx:controlsfx:11.2.1')
implementation('org.kordamp.bootstrapfx:bootstrapfx-core:0.4.0')

testImplementation("org.junit.jupiter:junit-jupiter-api:${junitVersion}")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:${junitVersion}")

// https://mvnrepository.com/artifact/com.itextpdf/itextpdf
implementation('com.itextpdf:itextpdf:5.5.13.3')

// https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15to18
implementation('org.bouncycastle:bcprov-jdk15to18:1.70')

// https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk15on
implementation('org.bouncycastle:bcpkix-jdk15on:1.70') {
exclude group: 'org.bouncycastle', module: 'bcprov-jdk15on'
}
}
Мне пришлось исключить модуль bcprov-jdk15on из bcpkix-jdk15on, потому что в противном случае я получаю ошибку дублирования модуля.
Я использую версии bcprov и bcpkix, те, которые указаны в pom.xml версии itextpdf 5.5.13.3.

Кроме того, я проверил jar bcpkix-jdk15on, и рассматриваемый класс находится там.
Информация о модуле:

Код: Выделить всё

module a.b.c {
requires javafx.controls;
requires javafx.fxml;

requires org.controlsfx.controls;
requires org.kordamp.bootstrapfx.core;
requires itextpdf;

opens a.b.c to javafx.fxml;
exports a.b.c;
exports a.b.c.controllers;
exports a.b.c.dtos;
opens a.b.c.controllers to javafx.fxml;
}
Строка, вызывающая исключение:

Код: Выделить всё

MakeSignature.signDetached(appearance, bouncyCastleDigest, privateKeySignature, chain, null, null, null, 0, MakeSignature.CryptoStandard.CMS);
И исключение:

Код: Выделить всё

Exception in thread "JavaFX Application Thread"  java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at javafx.fxml/javafx.fxml.FXMLLoader$MethodHandler.invoke(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(Unknown Source)
at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
at javafx.base/javafx.event.Event.fireEvent(Unknown Source)
at javafx.graphics/javafx.scene.Node.fireEvent(Unknown Source)
at javafx.controls/javafx.scene.control.Button.fire(Unknown Source)
at javafx.controls/com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(Unknown Source)
at javafx.controls/com.sun.javafx.scene.control.inputmap.InputMap.handle(Unknown Source)
at javafx.base/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
at javafx.base/javafx.event.Event.fireEvent(Unknown Source)
at javafx.graphics/javafx.scene.Scene$MouseHandler.process(Unknown Source)
at javafx.graphics/javafx.scene.Scene.processMouseEvent(Unknown Source)
at javafx.graphics/javafx.scene.Scene$ScenePeerListener.mouseEvent(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(Unknown Source)
at javafx.graphics/com.sun.glass.ui.View.handleMouseEvent(Unknown Source)
at javafx.graphics/com.sun.glass.ui.View.notifyMouse(Unknown Source)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
Caused by:  java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javafx.reflect.Trampoline.invoke(Unknown Source)
at jdk.internal.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at javafx.base/com.sun.javafx.reflect.MethodUtil.invoke(Unknown Source)
at javafx.fxml/com.sun.javafx.fxml.MethodHelper.invoke(Unknown Source)
... 47 more
Caused by: java.lang.NoClassDefFoundError: org/bouncycastle/cert/X509CertificateHolder
at a.b.c.merged.module@0.1/com.itextpdf.text.pdf.security.MakeSignature.signDetached(Unknown Source)
at a.b.c.merged.module@0.1/com.itextpdf.text.pdf.security.MakeSignature.signDetached(Unknown Source)
at a.b.c@0.1/a.b.c.services.Service.sign(Unknown Source)
at a.b.c@0.1/a.b.c.services.Service.signSingle(Unknown Source)
at a.b.c@0.1/a.b.c.controllers.Controller.onSignButtonClick(Unknown Source)
... 57 more
Caused by: java.lang.ClassNotFoundException: org.bouncycastle.cert.X509CertificateHolder
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
... 62 more
Как я уже сказал, подпись работает без проблем, когда я запускаю приложение в IDE, но с скомпилированным образом происходит сбой.
Кстати, для компиляции изображения, я использую следующую команду: ./gradlew clean jlinkZip, а затем запускаю программу с файлом app.bat в папке bin.
Обновление 1: я забыл Упомяните, что касается дублированной ошибки модуля, которую я получаю, если не исключаю bcprov из bcpkix, я получаю эту ошибку только при компиляции с gradle. Если я запускаю приложение через IDE, я не получаю этой ошибки.
Обновление 2: я сравнивал размеры скомпилированных изображений с различными конфигурациями зависимостей и заметил это, когда добавьте только зависимость bcpkix, размер образа не увеличивается (точнее, файла «модуля», расположенного в папке lib). Это зависимость, в которой отсутствует класс. Возможно ли, что gradle не компилирует приложение с этой зависимостью? Если да, то почему? Этого не происходит с зависимостью bcprov-jdk15to18, только с bcpkix-jdk15on.
Буду признателен за любую помощь.
Спасибо.

Подробнее здесь: https://stackoverflow.com/questions/790 ... nderror-or

Вернуться в «JAVA»