【问题标题】:Axiom Implementation Loader OverrideAxiom 实现加载器覆盖
【发布时间】:2015-12-11 17:20:18
【问题描述】:

我遇到了AxiomMule 的一系列问题,可以在这里找到背景:

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 shade,我改名了:

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的一个例子:

http://grepcode.com/file/repo1.maven.org/maven2/org.apache.ws.commons.axiom/axiom-impl/1.2.13/META-INF/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>

但这没有任何效果。有没有办法覆盖厄运加载器类名?

【问题讨论】:

    标签: mule maven-shade-plugin axiom


    【解决方案1】:

    要自动进行必要的转换,您可以使用以下配置:

        <plugins>
            <plugin>
                <artifactId>maven-shade-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <artifactSet>
                                <includes>
                                    <include>org.apache.ws.commons.axiom:*</include>
                                </includes>
                            </artifactSet>
                            <transformers>
                                <transformer implementation="org.apache.axiom.buildutils.shade.axiomxml.AxiomXmlResourceTransformer" />
                            </transformers>
                            <relocations>
                                <relocation>
                                    <pattern>org.apache.axiom</pattern>
                                    <shadedPattern>org.apache.1.2.14.axiom</shadedPattern>
                                </relocation>
                            </relocations>
                        </configuration>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>org.apache.ws.commons.axiom</groupId>
                        <artifactId>shade-axiom-xml</artifactId>
                        <version>1.2.17-SNAPSHOT</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    

    您需要将 Apache 快照存储库添加到您的 POM 中(因为目前还没有包含 change 的版本来完成这项工作):

        <repositories>
            <repository>
                <id>apache.snapshots</id>
                <name>Apache Snapshot Repository</name>
                <url>http://repository.apache.org/snapshots</url>
                <releases>
                    <enabled>false</enabled>
                </releases>
            </repository>
        </repositories>
    

    请注意,shade-axiom-xml 版本 1.2.17-SNAPSHOT 应该可以与 Axiom 1.2.14 一起正常工作,即您不需要更改您所依赖的 Axiom 库的版本。

    另外,不要忘记,由于您使用的是 Axis2 并且 Axis2 依赖于 Axiom,因此您需要在工件集中包含所有 Axis2 JAR。

    【讨论】:

    • 嗨 Andreas,抱歉回复延迟。所以当我使用你的插件定义时,我回到原来的错误“geMetaFactory(NoSuchMethodError)”我一定做错了,但是复制粘贴你的插件定义,它不再尝试加载“org.apache.1.2.14. axiom”,它只是“org.apache.axiom”,所以它再次使用旧版本并且没有任何阴影。
    • 当你说没有任何东西被着色时,你是否通过检查 maven-shade-plugin 生成的 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) 你可以看到包名代表了通过阴影创建的内容。具体来说,参考“1.2.14”。新错误不再包含“1.2.14”,只包含“org.apache.axiom”。错误是由于使用旧版本导致的没有这种方法。
    • 很公平。你选择不回答我的问题,所以我想你不需要我的帮助。
    • 我以为我确实回答了你的问题。我是在告诉你我是如何得出它没有被遮蔽的结论的。我非常感谢您的帮助,我不知道我的回答如何冒犯了您,但我很抱歉。
    【解决方案2】:

    当发生此类 ClassCastException 时,可以尝试从着色中排除有问题的类(应用程序正在转换的类,即在您的情况下,您应该排除 org.apache.axiom.locator.loader.OMMetaFactoryLoader)。

    你可以这样做:

    <relocations>
        <relocation>
            <pattern>org.apache.axiom</pattern>
            <shadedPattern>org.apache.1.2.14.axiom</shadedPattern>
            <excludes>
                <exclude>org.apache.axiom.locator.loader.OMMetaFactoryLoader</exclude>
            </excludes>
        </relocation>
    </relocations>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 2011-05-05
      相关资源
      最近更新 更多