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

JBoss EAP 6.4: NoClassDefFoundError on class sun.security.jca.GetInstance

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

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

上抛出 NoClassDefFoundError

查看 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 中,但 classloader 只找到前者。

什么是 jboss 模块 classloader 正在播放,我怎样才能让它停止?

感谢您的建议。

在您的 JBoss 安装中,转到目录 modules/sun/jdk/main 并在那里编辑 module.xml 文件。在 <dependencies>/<system>/<paths> 中添加一个元素 <path name="sun/security/jca"/>。重新启动您的 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>

另一种选择,您可以导入整个系统模块,将以下行添加到 MANIFEST.MF:

Dependencies: system

参考:Class Loading and Modules

我终于解决了我的问题,虽然不是完全按照上面建议的方式。如果没有帮助,我不会到达那里(谢谢你们)。

我确实设法解决了 sun/security/jca 访问问题,但它随后引发了另一个类似类型的问题,但使用的是 javax class。我通过从模块 org/jboss/genericjms 中删除一个 jar 并让 jdk 版本被拾取来找到一个丑陋的修复方法,但我觉得这玩弄了太多我无法预测的东西

的后果

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

    <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 模块化 class 加载程序之后,请随时给我一个分层的。

再次感谢您的帮助。