2

我遇到了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 阴影,我重命名:

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>

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

4

2 回答 2

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(因为还没有包含使此工作的更改的版本):

    <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。

于 2015-12-11T22:30:21.793 回答
1

当发生此类 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>
于 2018-03-14T10:04:35.487 回答