解析方法时加载约束冲突
Posted
技术标签:
【中文标题】解析方法时加载约束冲突【英文标题】:Loading constraint violation when resolving method 【发布时间】:2020-07-07 13:44:13 【问题描述】:我需要将项目从 Java 7 迁移到 Java 8 并将其部署在 WAS 9 上(在此迁移应用程序在 Java 7 和 WAS 8.5 上运行之前) 因此,我将 Java 升级到版本 8 并在 pom.xml 中添加了一些必要的依赖项,但我在日志文件中遇到了这个错误,实际上我不知道应该怎么做才能解决它。我错过了一些依赖吗?我应该排除一些 jar 文件吗?
此外,对于这个项目,类加载器在 Websphere 中被配置为最后一个父级。
引起:java.lang.LinkageError:加载约束冲突时 解决方法 “javax/xml/bind/Unmarshaller.unmarshal(Ljavax/xml/stream/XMLStreamReader;Ljava/lang/Class;)Ljavax/xml/bind/JAXBElement;” :加载程序“com/ibm/ws/classloader/CompoundClassLoader@ebfd011c” 类“org/apache/cxf/configuration/spring/JAXBBeanFactory”和加载器 类的“com/ibm/oti/vm/BootstrapClassLoader@38c22f6e” “javax/xml/bind/Unmarshaller”有不同的方法类型 签名于 org.apache.cxf.configuration.spring.JAXBBeanFactory.createJAXBBean(JAXBBeanFactory.java:51)
引起:org.springframework.beans.factory.BeanCreationException: 创建名为 AuthenticationServicePort.jms-conduit 的 bean 时出错: 无法创建类型的内部 bean '(inner bean)' [org.apache.cxf.configuration.spring.JAXBBeanFactory] 设置时 bean 属性 'clientConfig';嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建名为“(内部 bean)”的 bean:bean 实例化失败; 嵌套异常是 org.springframework.beans.factory.BeanDefinitionStoreException: 工厂方法 [public static java.lang.Object org.apache.cxf.configuration.spring.JAXBBeanFactory.createJAXBBean(javax.xml.bind.JAXBContext,java.lang.String,java.lang.Class)] 抛出异常;嵌套异常是 java.lang.LinkageError: loading 解决方法时违反约束 “javax/xml/bind/Unmarshaller.unmarshal(Ljavax/xml/stream/XMLStreamReader;Ljava/lang/Class;)Ljavax/xml/bind/JAXBElement;” :加载程序“com/ibm/ws/classloader/CompoundClassLoader@ebfd011c” 类“org/apache/cxf/configuration/spring/JAXBBeanFactory”和加载器 类的“com/ibm/oti/vm/BootstrapClassLoader@38c22f6e” “javax/xml/bind/Unmarshaller”有不同的方法类型 签名
有人知道我该怎么办吗?还是我做错了什么?
在此先感谢
【问题讨论】:
这样的链接错误通常是由打包在不同类加载器中的两个版本的 API 之间的交叉可见性引起的。您是否在应用程序中包含 JAXB 和/或 StAX API(该方法签名中的两件事)的副本,并将类加载器设置为 parent-last 委托?如果是这样...删除它们可能会起作用(它们包含在服务器/JDK中)。 @Jarid 这个项目基本上由 2 个应用程序组成。在这个不起作用的情况下,我从导出的战争中删除了 lib 文件夹中的所有 STAX jar 文件,并且我在 lib 文件夹中没有任何 JAXB jar 文件。在另一个工作正常的情况下,我同时拥有 JAXB 和 STAX jar 文件。尽管该应用程序可以正常工作,但我是否也应该删除它们? 他们可能在工作应用程序中对您没有任何好处,但如果它工作正常,我可能不建议更改任何内容并冒着损坏的风险。 @Jarid 我设法以某种方式解决了它。不知道是不是最正确的,你可以看看下面的评论。 【参考方案1】:好的,我想通了
这是我所做的:
-
将 jaxb-api 依赖项升级到 2.2 版
将 jaxb-impl 依赖项升级到 2.1.9 版
添加 cxf-rt-transports-http 依赖项(版本 2.7.11)
从导出的war中的lib文件夹中删除所有JAXB jar文件和STAX jar文件,但我只留下了stax2-api-3.1.4.jar在里面
【讨论】:
以上是关于解析方法时加载约束冲突的主要内容,如果未能解决你的问题,请参考以下文章
如何在解析do while / while时解决移位/减少冲突