我有一个调用javax.crypto.SecretKeyFactory.getInstance
的部署。
类javax.crypto.SecretKeyFactory
似乎可以正确加载,但当方法尝试创建实例时,会在NoClassDefFoundError
sun/security/jca/GetInstance
查看OpenJDK8源代码显示相关的javax.crypto.SecretKeyFactory
构造函数明确引用sun.security.jca.GetInstance
中的方法,因此尝试加载它是正常的。
奇怪的是javax/crypto/SecretKeyFactory.class
和sun/security/jca/GetInstance.class
都出现在/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.91-1.b14.el6.x86_64/jre/lib/rt.jar
中,但只有前者是由类加载器找到的。
什么是jboss模块类加载器播放,如何让它停止?
感谢您的建议。
答案 0 :(得分:3)
默认情况下,并非所有JDK类都会向部署公开。如果您的部署使用未公开的JDK类,则可以使用具有系统依赖性的jboss-deployment-structure.xml
访问它们:
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
<deployment>
<dependencies>
<system export="true">
<paths>
<path name="sun/security/jca"/>
</paths>
</system>
</dependencies>
</deployment>
</jboss-deployment-structure>
您可以导入整个系统模块的另一种方法是将以下行添加到MANIFEST.MF
:
Dependencies: system
答案 1 :(得分:1)
在JBoss安装中,转到目录modules/sun/jdk/main
并在那里编辑module.xml
文件。在<dependencies>/<system>/<paths>
中添加元素<path name="sun/security/jca"/>
。重新启动JBoss实例并重试。
答案 2 :(得分:0)
我终于解决了我的问题,虽然不完全按照上面提到的方式。我不会在没有帮助的情况下到达那里(谢谢你们)。
我确实设法修复了sun / security / jca访问问题但是它引发了另一个类似类型的问题,但是使用了javax类。通过从模块org / jboss / genericjms中删除一个jar并让jdk版本被拾取,我找到了一个丑陋的修复程序,但是我觉得那是因为我无法预测其结果所带来的太多东西。
我最终解决的问题是将提供的jar引用javax / crypto / SecretKeyFactory引用到一个新的模块中,然后通过以下方式引入所需的类:
<system export="true">
<paths>
<path name="java/sql"/>
<path name="javax/crypto"/>
<path name="javax/crypto/spec"/>
<path name="javax/crypto/interfaces"/>
<path name="javax/management"/>
<path name="javax/security/auth/login"/>
<path name="sun/security/jca"/>
<path name="org/ietf/jgss"/>
</paths>
</system>
在module.xml中。当我从我的代码中引用这个新模块时,它可以工作(事实上我将它作为standalone.xml中的全局模块将其拉入。)
问题解决了。虽然我不得不说在经历了jboss模块化类加载器的经验之后,每天给我一个分层的。
再次感谢您的帮助。