【问题标题】:Two jars having same package name, same class name and same method name具有相同包名、相同类名和相同方法名的两个 jar
【发布时间】: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


【解决方案1】:

如果您将这些 jar 作为依赖项加载,您可以通过

将其从 Maven 中排除
<exclusions>
   <exclusion>
       <groupId>org.XXXX</groupId>
        <artifactId>jar1-api</artifactId>
    </exclusion>
</exclusions> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 2015-07-18
    • 1970-01-01
    • 2011-01-26
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多