1

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

第一个 jar:
在此处输入图像描述

第二个 jar:
在此处输入图像描述

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

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

我怎样才能始终使用第一个 .class 并排除第二个?我不需要第二个.class,但我需要他图书馆中的其他类。

4

2 回答 2

1

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

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

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

于 2013-10-20T17:37:45.500 回答
0

不要像导入整个包

import org.mindswap.*;

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

import org.mindswap.wsdl.WSDLTranslator;
于 2013-10-20T17:33:41.373 回答