JBoss EAP 6.4:类sun.security.jca.GetInstance上的NoClassDefFoundError

时间:2017-04-10 15:25:14

标签: jboss jboss-eap-6

我有一个调用javax.crypto.SecretKeyFactory.getInstance的部署。

javax.crypto.SecretKeyFactory似乎可以正确加载,但当方法尝试创建实例时,会在NoClassDefFoundError

上抛出sun/security/jca/GetInstance

查看OpenJDK8源代码显示相关的javax.crypto.SecretKeyFactory构造函数明确引用sun.security.jca.GetInstance中的方法,因此尝试加载它是正常的。

奇怪的是javax/crypto/SecretKeyFactory.classsun/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模块类加载器播放,如何让它停止?

感谢您的建议。

3 个答案:

答案 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

参考:Class Loading and Modules

答案 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模块化类加载器的经验之后,每天给我一个分层的。

再次感谢您的帮助。