【问题标题】:JBoss EAP 6.4: NoClassDefFoundError on class sun.security.jca.GetInstanceJBoss EAP 6.4:类 sun.security.jca.GetInstance 上的 NoClassDefFoundError
【发布时间】:2017-04-10 15:25:14
【问题描述】:

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

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 中,但类加载器只能找到前者。

jboss 模块类加载器在播放什么,我怎样才能让它停止它?

感谢您的建议。

【问题讨论】:

    标签: jboss jboss-eap-6


    【解决方案1】:

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

    【讨论】:

    • 我已经尝试过了,但它似乎并没有改变任何东西。我最初把它放在耳边的战争中,但 jboss 日志包含一行说它将忽略它,因为它不在顶层。然后我把它移到耳朵里的 META-INF,但尽管没有收到日志消息说它会忽略它,但它似乎还是忽略了它。不知道为什么,
    • @jontyl 如果您只是使用 export="true" 将它们添加到顶级部署中,那么它们将可用于耳中的所有内容。
    • WildFly10 下不工作。我的方法是 webapp\WEB-INF >[WildFly10]/modules/system/layers/base/sun/jdk/main/module.xml 它对我有用。
    • 在 jboss 6.4.9.GA 中工作。
    【解决方案2】:

    在您的 JBoss 安装中,转到目录 modules/sun/jdk/main 并在那里编辑 module.xml 文件。在&lt;dependencies&gt;/&lt;system&gt;/&lt;paths&gt; 中添加一个元素&lt;path name="sun/security/jca"/&gt;。重新启动您的 JBoss 实例并重试。

    【讨论】:

    • 由于我工作的环境,这有点问题 - 我认为我不会被允许更改此文件的内容。我将尝试使用您的建议中的相关位创建一个新模块,看看是否可行(可以添加用户提供的模块)。
    • @jontyl 很多“旧”的 sun 包都被关闭了,你可以从 module.xml 中包含的包中看到。我曾经不得不明确地允许sun/net,这是我能做到的唯一方法。不过我不是 JBoss/WildFly 方面的专家,可能还有其他更好的方法。
    • @jontyl 你找到解决问题的方法了吗?
    【解决方案3】:

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

    我确实设法解决了 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 模块化类加载器之后,总有一天给我一个分层的。

    再次感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 2018-05-07
      • 2019-02-17
      • 2016-09-10
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 2015-11-19
      • 2018-09-16
      • 1970-01-01
      相关资源
      最近更新 更多