我试图在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
的快照。
但是,当我运行我的测试方法时,我得到一个运行时异常
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:相同的片段似乎在非骡子项目上正常工作,表明这是一个与骡子相关的问题。
答案 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)并避免对所有安装进行修改,但是目前这是唯一对我有用的解决方案。