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.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
中,但 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
我终于解决了我的问题,虽然不是完全按照上面建议的方式。如果没有帮助,我不会到达那里(谢谢你们)。
我确实设法解决了 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 加载程序之后,请随时给我一个分层的。
再次感谢您的帮助。
我有一个调用 javax.crypto.SecretKeyFactory.getInstance
的部署。
class javax.crypto.SecretKeyFactory
似乎加载正确,但是当该方法尝试创建实例时,它会在 sun/security/jca/GetInstance
NoClassDefFoundError
查看 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
中,但 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
我终于解决了我的问题,虽然不是完全按照上面建议的方式。如果没有帮助,我不会到达那里(谢谢你们)。
我确实设法解决了 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 加载程序之后,请随时给我一个分层的。
再次感谢您的帮助。