2013-02-01 37 views
1

我只是想测试使用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。有什么想法吗?提前致谢。

回答

0

我在轨道基地?

不,你看起来像是在这里。

确认它的方法是在部件库JAR中取org.sfl4j.Logger的副本,并使用javah来查看它是否具有void trace(String, Object)方法。

一旦你确认它,也有一些解决办法:

  • 最干净的解决办法是让窗口小部件库的源代码的保留,重新编译反对sfl4j的版本,您需要并构建新版本的JAR而不嵌入sfl4j。 (您可能需要修改部件库的来源,但不太可能)。

  • 一个更简单的解决方案可能会确保您将新的(并且应该向后兼容)slf4 API JAR放在类路径上的小部件库JAR之前。这样,小部件JAR中的旧版本的slf4j将被新版本的“阴影”所加上Camel需要的额外方法。

0

“有没有办法知道它在这里使用的是什么版本的SLF4J,但我 愿意打赌,这是一个版本,它比早期的1.6.x版,这是 骆驼2.10.3想要的东西” ...

为什么不从widget-lib-3.0.jar反编译类文件,看看所需的方法是否存在?

0

您的方法是正确的。 SLF4J 1.x版本之间的API兼容。 (您是否在使用Maven?它旨在防止这种问题)。

什么是widget-lib?有没有一个版本不包含它的依赖关系?如果有,你应该使用它。