【发布时间】:2014-09-24 07:35:45
【问题描述】:
我在 JavaFX 中创建了与智能卡交互的应用程序(通过位于 jre/lib/ext/sunpkcs11.jar 的类 sun.security.pkcs11.SunPKCS11)。执行maven jfx:run 目标(javafx-maven-plugin 插件)时,程序运行良好。
不幸的是,在创建 jar 存档(使用 jfx:jar 目标)并运行结果 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 到maven 并在项目pom 文件中添加依赖项找到了解决此问题的简单方法。正如我所提到的,这种解决方案是“解决方法”并且看起来很难看。
为什么应用程序找不到“标准”库之一? JavaFX jar 是否使用了看不到这个库的自定义类加载器?
即使我使用自己的 JRE 创建本机包(在我的情况下为 .exe),它也看不到该类。
更新
这不是评论中链接的问题的重复,我有 32 位 JDK 和 JRE。 JAVA_HOME 也指向 32 位 JRE。
【问题讨论】:
-
@AntJavaDev 感谢您的回答,我已阅读本段并使用
jfx:jar目标(由于项目结构复杂,没有clean)。我也在运行正确的 jar(来自target/jfx/app目录)。 -
是的,我的意思是你能看看在请求的 /lib 文件夹中是否存在你的 jar 吗?因为如果它不存在意味着 maven 没有导出它
-
我可以看到
lib/目录。它位于target/jfx/app并包含所有项目自定义依赖项。但是,它不包含sunpkcs11.jar(除非我使用有问题的解决方法),因为这是 JRE 库。 -
好吧,我不明白为什么你把它作为依赖项放在 pom 中很难看(你没有所有其他外部项目依赖项???),因为如果你不这样做,它就不会被导出构建项目后,这就是为什么您在 /lib 文件夹中看不到它
标签: java maven javafx shared-libraries classpath