【发布时间】:2020-03-20 15:03:37
【问题描述】:
我在使用两个 jar 的 Spring Boot 应用程序中遇到了这个问题。在这些 jar 中,有两个具有相同包名和相同类名的类以及一个具有相同名称的方法。当类加载器从不同的 jar 加载类并尝试调用此方法时会出现问题,如果先加载 jar A,则调用方法并且一切正常,但如果先调用 jar B,则在运行时抛出 NOSUCHMETHODERROR 异常。你能帮忙解决这个问题吗?有没有一种方法可以强制类加载器首先加载特定的 jar,总是在 Spring Boot 应用程序中,或者可能有任何其他解决方法。
注意:我使用的是 JAVA 8,我无权访问这些 jar 文件的源代码。
【问题讨论】:
-
为什么会有两条完全相同的路径?这没有任何意义。
-
那是别人写的代码,源代码不可用。这就是为什么:)
-
"别人写的代码",不要用。我没有看到任何体面的方法来做到这一点。你能做的(我不会)是创建两个新库,一个是你的类从 jar A 扩展类,另一个是 jar B。这可能会有所帮助
-
您不需要源代码来从类路径中删除 jar 文件或从 jar 文件中删除
.class条目。除此之外,在标准URLClassLoader的情况下,将按指定顺序搜索类路径条目。 -
在某些情况下您无法解决此问题。在我的生产(dbWatch)中,我们必须连接到给定数据库的所有版本。所以我们需要同时支持多个oracle驱动。它们包含不同版本的相同类。
标签: java spring-boot java-8 jar classloader