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

JBoss EAP 6.4:sun.security.jca.GetInstance类上的NoClassDefFoundError,jboss,jboss-eap-6,Jboss,Jboss Eap 6,我有一个调用javax.crypto.SecretKeyFactory.getInstance的部署 类javax.crypto.SecretKeyFactory似乎加载正确,但当该方法尝试创建实例时,它会在sun/security/jca/GetInstance上抛出NoClassDefFoundError 查看OpenJDK8源代码可以发现,相关的javax.crypto.SecretKeyFactory构造函数显式引用了sun.security.jca.GetInstance中的方法,因此

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

javax.crypto.SecretKeyFactory
似乎加载正确,但当该方法尝试创建实例时,它会在
sun/security/jca/GetInstance
上抛出
NoClassDefFoundError

查看OpenJDK8源代码可以发现,相关的
javax.crypto.SecretKeyFactory
构造函数显式引用了
sun.security.jca.GetInstance
中的方法,因此它尝试加载它是正常的

奇怪的是
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.91-1.b14.el6.x86_64/jre/lib/rt.jar
中同时存在
javax/crypto/SecretKeyFactory.class
sun/security/jca/GetInstance.class
,但类加载器只能找到前者

jboss模块类加载器的作用是什么?如何让它停止


谢谢您的建议。

在您的JBoss安装中,转到目录
modules/sun/jdk/main
并编辑那里的
module.xml
文件。在
/
中添加元素
。重新启动JBoss实例,然后重试。

默认情况下,并非所有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>

Ref:

我终于解决了我的问题,尽管不是按照上面建议的方式。如果没有帮助,我是不可能到达那里的(谢谢大家)

我确实设法解决了sun/security/jca访问问题,但随后它又抛出了另一个类似类型的问题,不过是一个javax类。我从模块org/jboss/genericjms中删除了一个jar,并让jdk版本得到了提升,从而找到了一个丑陋的解决方案,但我觉得这是在玩太多我无法预测后果的东西

我最终确定的修复方法是将提供的引用javax/crypto/SecretKeyFactory的jar单独放在一个新模块中,然后通过以下方式引入所需的类:

    <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模块化类装入器之后,请随时给我一个层次化类装入器


再次感谢您的帮助。

我已经试过了,但似乎没有任何改变。我最初把它放在一个耳朵内的战争中,但是jboss日志中有一行代码说它将忽略它,因为它不在顶级。然后我把它移到META-INF的耳朵,但尽管没有得到日志消息说它将忽略它,它似乎忽略了它无论如何。我不知道为什么,@jontyl如果您只是使用
export=“true”
将它们添加到顶级部署,那么它们将可用于ear中的所有内容。它在WildFly10下不起作用。我的方法是在webapp\WEB-INF和[WildFly10]/modules/system/layers/base/sun/jdk/main/module.xml中,它对我有效。在jboss 6.4.9.GA中有效。由于我所处的环境,这有点问题-我认为我不允许更改此文件的内容。我将尝试使用您的建议中的相关部分创建一个新模块,看看是否有效(有添加用户提供模块的功能)。@jontyl许多“旧”sun软件包被关闭,您可以从
module.xml
中包含的软件包中看到这一点。我曾经不得不明确地允许sun/net,这是我唯一能做到的。但是我不是JBoss/WildFly方面的专家,可能还有其他更好的方法。@jontyl您找到解决问题的方法了吗?
    <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>