我刚刚尝试测试一个使用 Apache Camel 2.10.3 的应用程序,并且在DefaultCamelContext
实例化后立即得到以下异常:
java.lang.NoSuchMethodError: org.slf4j.Logger.trace(Ljava/lang/String;Ljava/lang/Object;)V
at org.apache.camel.impl.DefaultPackageScanClassResolver.<init>(DefaultPackageScanClassResolver.java:70)
at org.apache.camel.impl.DefaultCamelContext.<init>(DefaultCamelContext.java:222)
我确保slf4j-api-1.6.6
(这是 Camel 2.10.3 附带的)在运行时类路径上。接下来,我怀疑我可能有其他也使用 SLF4J 的依赖项,但依赖于它的不同版本。所以我打开 Eclipse,然后运行类型搜索org.slf4j.Logger
,果然,我看到该类在 2 个不同的 JAR 中列出:(slf4j-api-1.6.6.jar
如预期的那样!),以及另一个 3rd 方 jar widget-lib-3.0.jar
,.
所以我打开了widget-lib3.0.jar
,看到 SLF4J 像这样打包在里面:
widget-lib-3.0/
com/
<Widget Lib's compiled classes>
org/
slf4j/
spi/
...
impl/
...
<A bunch of SLF4J classes, like LoggerFactory.class, etc.>
没有办法知道它在这里使用的是什么版本的 SLF4J,但我敢打赌它是早于 1.6.x 的版本,这正是 Camel 2.10.3 想要的。
所以我最好的,稍微受过教育的猜测是,在运行时,JRE 类加载器widget-lib-3.0.jar#org/slf4j/Logger
首先找到并加载它,然后它们去加载 Camel JAR 及其依赖项。然后,当DefaultPackageScanClassResolver
调用 SLF4Jtrace(String,Object)
方法时,它没有找到 SLF4J 的 1.6.6 版本,而是找到了附带的任何版本widget-lib-3.0.jar
,并且该方法/重载不存在。
我在离开基地的路上吗?如果我不在基地,这对你意味着什么,所以?如果我走上正轨,那么我提出的解决方案将是在widget-lib-3.0.jar
没有org/slf4j
包的情况下重新 JAR(不存在其他更现代的版本)。我的理论是slf4j-api-1.6.6
,它是向后兼容的,它将是唯一被加载的 SLF4J 版本,然后适用于两个 JAR。有什么想法吗?提前致谢。