【问题标题】:Java NoSuchMethodError same class nameJava NoSuchMethodError 类名相同
【发布时间】:2013-10-20 17:25:48
【问题描述】:

我在两个不同的 .jar 文件中有两个同名和同一个包的 .class 文件

第一个罐子:


第二个罐子:

当我从 eclipse 运行程序时我没有问题,eclipse 使用第一个 .class 文件(我必须使用第一个 .class,我不需要第二个 .class,我想排除它)。

当我导出可运行的 .jar 时,我看到执行了第二个 .class 文件,然后我有了 NoSuchMethodError 异常,因为第二个 .class 与第一个不同。

如何始终使用第一个 .class 并排除第二个? 我不需要第二个 .class,但我需要他库中的其他类。

【问题讨论】:

    标签: java eclipse jar nosuchmethoderror


    【解决方案1】:

    Java 从类路径加载类,该类路径在您在 Eclipse 中运行应用程序时动态定义,并由位于 jar 文件中 META-INF 下的文件 MANIFEST.MF 中的属性 Class-Path 控制。

    所以,首先使用任何 ZIP 工具打开 jar 文件并查看清单。尝试将jar文件的顺序更改为清单并再次运行。我希望这将有所帮助。

    但是你的alive-matchmarker.jar 包含它不应该包含的文件是非常糟糕的。我不知道它是什么库,但他们是否有可能拥有其他不包含自己依赖项的发行版?或者可能尝试找到这个库的其他版本。更糟糕的是,如果您的类路径中有同一个类的不同版本:由于这种重复,您的应用程序的行为可能会出现错误和不可预测,因为您永远无法知道现在使用的是哪个版本的类。

    【讨论】:

    • 幸运的是alive-matchmarker.jar 是开源的,然后我重新编译了.jar,重命名了包。
    【解决方案2】:

    不要像导入整个包

    import org.mindswap.*;
    

    您可以从任何特定包中导入您想要的特定类,例如

    import org.mindswap.wsdl.WSDLTranslator;
    

    【讨论】:

    • 两个.jar同名:org.mindswap.wsdl,唯一不同的是.jar的名字
    • 一种解决方法是定义您的自定义类加载器并加载正确的类。我希望有一个更简单的出路。
    猜你喜欢
    • 2012-09-17
    • 1970-01-01
    • 2020-11-06
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 2017-09-26
    • 2020-03-20
    相关资源
    最近更新 更多