Я создал приложение в JavaFX, которое взаимодействует с smartcards (через класс sun.security.pkcs11.SunPKCS11
расположенный в jre/lib/ext/sunpkcs11.jar
). Программа работает и работает хорошо, когда jfx:run
maven jfx:run
goal (javafx-maven-plugin
plugin).
К сожалению, после создания архива jar (с использованием jfx:jar
goal) и запуска jfx:jar
результата. Приложение запускает исключение при запуске:
Caused by: java.lang.ClassNotFoundException: sun.security.pkcs11.SunPKCS11
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 12 more
Я нашел простую sunpkcs11.jar
проблему для этой проблемы, установив sunpkcs11.jar
локально на maven и добавив зависимость в файл проекта pom. Такое решение, как я уже упоминал, "обходное решение" и выглядит уродливым.
Почему приложение не может найти библиотеку, которая является одной из "стандартных"? Является ли JavaFX jar использующим пользовательский загрузчик классов, который не видит эту библиотеку?
Даже когда я создаю собственный пакет (.exe в моем случае) со своей собственной JRE
он не может видеть этот класс.
Обновить
Это не дубликат вопроса, связанный в комментарии, у меня есть 32-битный JDK и JRE. JAVA_HOME
также указывает на 32-битную JRE.
У меня была такая же проблема. Я решил это, maven-antrun-plugin
библиотеки безопасности в каталог lib
(используя для этого maven-antrun-plugin
, но вы можете найти свой собственный способ сделать это).
Вероятно, вам придется скопировать файл sunpkcs11.jar
с вашей установки jre.
javafx-maven-plugin
и настроил стандартный maven-jar-plugin
для создания исполняемого jar с зависимостями.
jfx:jar
(безclean
из-за сложной структуры проектов). Я также использую правильный jar (изtarget/jfx/app
).