我正在尝试为我的项目制作一个Ant构建脚本,它在Eclipse中运行良好。当我尝试运行导出的jar时:
java -verbose:class -jar MyProject.jar
我收到了意外错误:
java.lang.NoSuchMethodError: com.employer.MyInterface.myMethod()I
真正奇怪的是这些调试尝试都会产生预期的输出(在导出之前和之后):
System.out.println("1:" + (myObj instanceof MyClass));
System.out.println("2:" + (myObj instanceof MyInterface));
Class c = MyClass.class;
URL myClassURL = c.getProtectionDomain().getCodeSource()
.getLocation();
System.out.println("url: " + myClassURL);
try {
Method[] m = c.getDeclaredMethods();
for (int i = 0; i < m.length; i++) {
System.out.println(m[i].toString());
}
} catch (Throwable e) {
System.err.println(e);
}
System.out.println("gni2:" + myObj.myMethod());
其中MyClass
实现MyInterface
。也就是说,如果我使用emacs检查它,我可以看到我的jar文件中的接口和类,我看到类加载器加载了每个,我在myMethod
中看到getDeclaredMethods
,只有一个jar中的MyClass.class
等等。
答案 0 :(得分:0)
我已将此更改为回答您自己的问题,因为我在输入问题时想出来了。而不是删除问题,这是解决方案,以防它帮助其他人。
问题最终导致我的项目所依赖的2个项目具有重叠的包+类名。我认为一位同事在过去的某个时刻将代码从一个项目复制到另一个项目,然后只维护其中一个。 Eclipse使用它根据Build Path设置中的顺序找到的第一个类,而Ant根据构建文件中的顺序覆盖另一个类(并且订单最终被反转)。