gpt4 book ai didi

java - 通过一些 JAR 手术修复 Java 类路径问题

转载 作者:行者123 更新时间:2023-12-01 04:52:55 26 4
gpt4 key购买 nike

我刚刚尝试测试一个使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com