【问题标题】:LinkageError - loading contraint violationLinkageError - 加载约束冲突
【发布时间】:2021-08-04 13:10:36
【问题描述】:

我在 websphere 应用程序服务器 (8.5.5.14) 中遇到 LinkageError。在这里发现了一个类似的问题 LinkageError

原因:java.lang.LinkageError:解析方法“javax/xml/soap/SOAPElement.getElementQName()Ljavax/xml/namespace/QName;”时加载约束冲突:类“org/springframework/ws/soap/saaj/SaajSoapElement”的加载器“com/ibm/ws/classloader/CompoundClassLoader@19d4f90e”和类“javax/”的加载器“com/ibm/oti/vm/BootstrapClassLoader@ca532309” xml/soap/SOAPElement" 的方法签名有不同的类型

【问题讨论】:

    标签: java spring soap websphere


    【解决方案1】:

    问题的原因是在您的应用程序中包含一个包含 javax/xml/namespace/QName 的 XML API jar,并且该应用程序被配置为使用 parent-last 类加载。发生这种情况时,您会得到以下链接模式:

    1. 应用程序类引用 javax/xml/soap/SOAPElement - 这个类是从 JDK 加载的
    2. SOAPElement 引用 javax/xml/namespace/QName - 它使用自己的类加载器加载它,因此它也可以在 JDK 中找到
    3. 应用程序类引用 org/springframework/ws/soap/saaj/SaajSoapElement - 这个类是从应用程序加载的
    4. SaajSoapElement 引用 SOAPElement 和 QName - SOAPElement 是从 JDK 加载的(和以前一样),但 QName 是从应用程序加载的,因为 parent-last 类加载器委托要求类加载器在委托给父类之前在本地搜索
    5. SaajSoapElement 现在可以“看到”两个 QName 副本,并且 Java 会抛出 LinkageError,因为这违反了加载约束

    您可以通过从应用程序中删除包含 QName 类的 XML jar 来解决这个问题(API 包含在服务器的 JDK 中),通过将 SOAP API 添加到应用程序(因此应用程序“看到”来自同一个类的两个类)位置),或者通过将您的类加载切换到父优先。 Parent-last 类加载通常容易受到此类问题的影响,因为它允许在类加载器之间进行比默认设置下通常可能的更多重复加载。如果您对自己的 XML API 版本没有非常明确的需求(XML API 已经包含在 Java SE 中很长时间了),我强烈建议您删除 jar 或切换到 parent-first。

    【讨论】:

    • 谢谢,贾里德。我在下面尝试过,1)父母优先:当我尝试使用父母优先加载选项时,我遇到了异常。我已经通过更改 parent-last 解决了这个问题。 java.lang.NoSuchMethodError: javax/ws/rs/core/Application.getProperties()Ljava/util/Map; (从文件加载:/apps/IBM/WebSphere/AppServer/plugins/javax.j2ee.jaxrs.jar 2) Paren-last:更改 parent-last 后,我​​得到了链接异常。并且,引用的 jar(包含 QName 类的 jar)依赖于另一个。所以,它不能被删除。有没有其他方法可以解决这个问题?
    • 服务器的JDK中封装的类的副本不能满足对QName的依赖有什么原因吗?确实,您依赖于自己的 JAX-RS API 副本,因此父类最后的类加载是适当的,但我仍然认为您不太可能需要打包到您的 QName 的特定版本应用程序。
    • 也就是说,另一种选择是将应用程序交换为父优先,仅将您明确需要自己版本的项目(我猜您的 JAX-RS API 和实现)放入共享库,配置该共享库以使用隔离的类加载器,并将其与应用程序关联。这将使您对共享库中的内容进行最后的父母委托,而其余的则让您获得父母优先的权利,从而使 LinkageErrors 的可能性大大降低。
    猜你喜欢
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多