我遇到了Axiom和Mule的一系列问题,可以在这里找到背景:
https://stackoverflow.com/questions/34164577/classloader-overrides-not-working-in-mule
正如上期评论中提到的,由于 jar 冲突,我能够使用 maven shade 覆盖 mule 中 axiom-api 的包名。Mule 在服务器中加载 axiom-api 和 axiom-impl 的一个版本。我在连接器中使用了不同版本的 axiom-api 和 axiom-dom。(连接器在任何点工作室之外都可以正常工作)
使用 Maven 阴影,我重命名:
org.apache.axiom
至
org.apache.1.2.14.axiom
这解决了我最初的问题,即由于 jar 版本冲突而找不到方法。现在我遇到的问题是:
org.apache.axiom.om.impl.dom.factory.OMDOMMetaFactoryLoader cannot be cast to org.apache.1.2.14.axiom.locator.loader.OMMetaFactoryLoader (java.lang.ClassCastException) org.apache.1.2.14.axiom.locator.ImplementationFactory:133 (null)
我相信这是因为用 maven shade 重命名了 axiom-api 的包。我的 Maven 阴影配置如下所示:
<configuration>
<artifactSet>
<includes>
<include>org.apache.ws.commons.axiom:*</include>
</includes>
</artifactSet>
<relocations>
<relocation>
<pattern>org.apache.axiom</pattern>
<shadedPattern>org.apache.1.2.14.axiom</shadedPattern>
</relocation>
</relocations>
</configuration>
因此,它实际上也应该重命名 axiom-dom,但它没有。
我相信这是由于类加载器只加载了 axiom-dom 包的一个实例。为了解决这个问题,我相信我只需要重命名:
org.apache.axiom.om.impl.dom.factory.OMDOMMetaFactoryLoader
至
org.apache.1.2.14.axiom.om.impl.dom.factory.OMDOMMetaFactoryLoader
我找到了 axiom.xml 的一个例子:
我找不到有关此文件的任何文档,但我看到它在源代码中的使用位置。我想我可以重写:
<implementation loader="org.apache.axiom.om.impl.dom.factory.OMDOMMetaFactoryLoader" name="doom">
<feature name="dom" priority="100"/>
</implementation>
至
<implementation loader="org.apache.1.2.14.axiom.om.impl.dom.factory.OMDOMMetaFactoryLoader" name="doom">
<feature name="dom" priority="100"/>
</implementation>
但这没有任何效果。有没有办法覆盖厄运加载器类名?