Oracle 10g上来自Webapp的"链接javax / xml / namespace / QName类时违反了加载程序约束"

时间:2020-03-06 14:43:39  来源:igfitidea点击:

我们有一个Web应用程序,可以将其部署在许多应用程序服务器上,包括Oracle 10g。但是,在该平台上,我们遇到了类路径问题。该Web应用程序使用JAXB 2,但是Oracle 10g随JAXB 1一起提供,这导致了错误。为了解决这些问题,我们将Oracle配置为首选Webapp中的类,但是现在在尝试实例化JAXB上下文时遇到了以上错误。

在查找"违反了装入器约束"异常时,似乎已经用一个类装入器装入了一个类,试图访问同一包中由私有包装入但由另一个类装入器装入的东西时,抛出该异常。我尝试删除我们的Web应用程序中包含javax.xml.namespace.QName的所有jar,并验证了正在拾取的是Oracle中包含的实例,但是仍然会发生错误。有任何想法吗?

(这是先前有关10g和JAXB 2的问题的后续内容。)

解决方案

我们正在使用什么版本的Java? rt.jar中包含了此类的最新版本。

也许这是完全无关的,但是我记得Weblogic在同一个类中遇到了一个问题。问题的原因是该类的序列号已更改(Sun意外更改了它)。解决方法是向JVM提供-Dcom.sun.xml.namespace.QName.useCompatibleSerialVersionUID = 1.0。

可能是同一个问题,只是误报了?试试吧。

看到这里:http://forums.bea.com/thread.jspa?threadID=600014563

此类是一半的WS Java库。从多个类加载器中加载它,然后进行比较比较很容易,这会导致LinkageError。

跟踪此问题的一种有效(但大锤)技术是从Java源代码修改Classloader,以转储该特定类在加载时从哪个jar加载,然后在bootclasspath之前添加修改后的版本:

-Xbootclasspath / p:/ path / to / hackedBin

我们可以只更新应用服务器的" lib"文件夹下的JAXB jar吗?