Mule项目中的Maven依赖项。类加载器控件无法按预期工作

时间:2014-12-24 01:01:36

标签: java maven junit mule mule-studio

我试图在maven中构建一个mule项目,该项目使用的库反过来使用apache-commons-codec-1.8。 Mule 3.5目前仅支持v 1.3

为了解决这个问题,我在骡子中实现了类加载器控件,并通过在mule-deploy.properties中执行以下操作来阻止mule加载其库版本。

loader.override=-org.apache.commons.codec

此外,我已更新pom.xml以包含库的1.9版本。以下是在项目上运行mvn:dependency tree的快照。 mvn:depedency tree 但是,当我运行我的测试方法时,我得到一个运行时异常

java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.encodeBase64URLSafeString([B)Ljava/lang/String;
    at com.nimbusds.jose.util.Base64URL.encode(Base64URL.java:64)
    at com.nimbusds.jose.util.Base64URL.encode(Base64URL.java:91)
    at com.nimbusds.jose.Header.toBase64URL(Header.java:238)
    at com.nimbusds.jose.JWSObject.<init>(JWSObject.java:101)
    at com.package.components.lastmile.originator.TokenSignerTemplate.sign(TokenSignerTemplate.java:109)
    at com.package.components.lastmile.originator.TokenSignerTemplate.signClaim(TokenSignerTemplate.java:122)
    at com.package.orchestration.LMSFakeClaimsHandler.testSignParse_Positive(LMSFakeClaimsHandler.java:120)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)

这显然是因为它引用了apache-commons的旧版本。如何确保它仅引用最新版本而不是旧版本?

mule-deploy.properties

#Fri Dec 12 09:58:12 PST 2014
loader.override=-org.apache.commons.codec
redeployment.enabled=true
encoding=UTF-8
domain=default
config.resources=..flows.

pom.xml的相关位置

<dependencies>
....
<dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.9</version>
        </dependency>


....
    <!-- Test to check commons-codec works -->
        <dependency>
        <groupId>org.mule.transports</groupId>
        <artifactId>mule-transport-http</artifactId>
        <version>${mule.version}</version>
        <scope>provided</scope>
        <exclusions>
            <exclusion>
                <groupId>commons-codec</groupId>
                <artifactId>commons-codec</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    </dependencies>

P.S:相同的片段似乎在非骡子项目上正常工作,表明这是一个与骡子相关的问题。

3 个答案:

答案 0 :(得分:0)

将以下排除项添加到您的pom。

<dependency>
        <groupId>org.mule.transports</groupId>
        <artifactId>mule-transport-http</artifactId>
        <version>${mule.version}</version>
        <scope>provided</scope>
        <exclusions>
            <exclusion>
                <groupId>commons-codec</groupId>
                <artifactId>commons-codec</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

然后添加Commons Codec 1.9的依赖项。 然后mule-deploy.properties中的覆盖属性将按预期工作。

更新:12月30日: 覆盖属性似乎是问题。

loader.override=-org.apache.commons.codec   is not correct.

尝试以下

loader.override=org.apache.commons.codec

希望这有帮助。

答案 1 :(得分:0)

如果您在Mule服务器中运行Mule应用程序,则从pom中排除lib将不起作用,因为编解码器lib存在于服务器本身中。

尝试在服务器 lib共享文件夹中插入最新的编解码器lib版本(维护属性loader.override=-org.apache.commons.codec

答案 2 :(得分:0)

jackson-xc也有类似的问题。我不知道为什么Mule 3.5带有杰克逊1库和2库的组合

jackson-annotations-2.1.1.jar
jackson-core-2.1.1.jar
jackson-databind-2.1.1.jar

jackson-core-asl-1.9.11.jar
jackson-jaxrs-1.9.11.jar
jackson-mapper-asl-1.9.11.jar
jackson-xc-1.7.1.jar

并使用 jackson-xc-1.7.1 而不是 jackson-xc-1.9.11 ,它将与其他 jackson 1的版本对齐库。

在我的应用程序中,它会产生“经典”库问题异常:

Caused by: java.lang.AbstractMethodError
    at org.codehaus.jackson.map.AnnotationIntrospector$Pair.findDeserializer(AnnotationIntrospector.java:1335)

因为使用

loader.override=...

进入 mule-deploy.properties 无效(在org.codehaus.jackson.xc包和org.codehaus.jackson.xc类上进行覆盖和/或阻止.JaxbAnnotationIntrospector),我发现的唯一解决方案是根据Nuno的回答,将我们要使用的jar放在一个比 lib / opt

更高优先级的lib文件夹中。

lib / shared 已被弃用,但您可以使用 lib / user 覆盖。

我宁愿使用 loader.override classloader-control-in-mule 3.5)并避免对所有安装进行修改,但是目前这是唯一对我有用的解决方案。