我只是想测试使用Apache的骆驼2.10.3的应用程序,并立即于DefaultCamelContext
被实例化,得到了以下异常:修复Java类路径的问题有一点JAR手术
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
(这是骆驼2.10.3附带的)在运行时类路径上。接下来,我怀疑我可能有其他的依赖,也使用SLF4J,但依赖于它的不同版本。所以我打开了Eclipse,并运行了org.slf4j.Logger
的类型搜索,果然,我看到该类列在2个不同的JAR中:slf4j-api-1.6.6.jar
(如预期的!)和另一个第三方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
首先,加载它,然后他们去加载骆驼JAR和它们的依赖关系。然后,当DefaultPackageScanClassResolver
调用SLF4J trace(String,Object)
方法时,它找不到SLF4J的1.6.6版本,而是找到widget-lib-3.0.jar
的任何版本,并且该方法/重载不存在。
我在轨道基地?如果我脱离基地,这对你意味着什么,所以呢?如果我走上正轨,那么我提出的解决方案将是在没有org/slf4j
软件包的情况下重新加载JAR widget-lib-3.0.jar
(没有其他更现代的版本)。我的理论是slf4j-api-1.6.6
,这是向后兼容的,将是唯一被加载的SLF4J版本,然后可用于两个JAR。有什么想法吗?提前致谢。