- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚尝试测试一个使用 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
(如预期!),以及另一个第 3 方 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
调用 SLF4J trace(String,Object)
方法,它不是找到 SLF4J 的 1.6.6 版本,而是找到 widget-lib-3.0.jar
附带的任何版本。 ,并且该方法/重载不存在。
我是否正在偏离基地?如果我说错了,这对你来说意味着什么?如果我步入正轨,那么我建议的解决方案是重新 JAR widget-lib-3.0.jar
没有 org/slf4j
其中的软件包(不存在其他更现代的版本)。我的理论是slf4j-api-1.6.6
向后兼容,将是唯一加载的 SLF4J 版本,然后适用于这两个 JAR。有什么想法吗?提前致谢。
最佳答案
Am I on track of way off base?
没有。看来您已步入正轨。
确认的方法是在小部件库 JAR 中获取 org.sfl4j.Logger
的副本,并使用 javah
查看它是否具有 void trace(String, Object)
方法与否。
一旦确认,有多种解决方案:
最干净的解决方案是获取小部件库的源代码,根据您需要的 sfl4j 版本重新编译它,并构建一个新版本的 JAR,而不在其中嵌入 sfl4j。 (您可能需要修改小部件库的源代码,但可能性不大)。
一个更简单的解决方案可能会确保您将更新的(并且据说向后兼容)slf4 API JAR 放在类路径上的小部件库 JAR 之前。这样,小部件 JAR 中的旧版本 slf4j 将被新版本的 Camel 需要的额外方法“遮蔽”。
关于java - 通过一些 JAR 手术修复 Java 类路径问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14644072/
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Real world use cases of bitwise operators 我不太确定按位运算符&和| ,有
我是一名优秀的程序员,十分优秀!