了解此错误:
这是一个java.lang.LinkageError 错误,当 jvm 尝试链接加载的类时发生。注意代码是先编译的(和依赖的类),然后所有涉及的类都被jvm加载,然后这些类链接在一起。
想想错误:NoSuchField,表示链接目标类时,字段不存在。但是在编译时,类应该有那个字段,否则代码无法编译。链接后,jvm 发现该字段不存在。所以唯一的原因是我们正在使用具有该字段的类进行编译,并且加载并链接了该类的另一个版本(没有该字段)。
在导致此错误的两个常见原因之间确定您的情况
通常错误加载的类要么是你修改过的源代码,要么是你依赖的 jar 包中的一个类。我们可以通过将-verbose:class 参数添加到试图在您的ide 中运行您的应用程序的jvm 来查找错误加载的类来决定这一点。此参数在控制台中打印所有加载的类。在eclipse中,我们将它放置在:右键单击您的项目->运行方式->运行配置->arguments标签->VM argument字段。
找到错误加载的类后,通常要么是你项目中有源代码的类,要么是你的项目所依赖的jar包。
不同的情况导致不同的解决方案。
源码案例解决方案:
您可能更改了该类(在源代码中添加了该字段),但没有重新编译它。可能由于不同的原因,但是你应该删除旧版本编译的那个类的.class文件,然后重新编译它,让新版本的.class文件包含那个字段。
jar包案例解决方案:
你应该尽量让项目加载正确的jar包。但是为什么要使用不同的版本通常是因为它们都依赖(由项目的不同部分)。情况很简单(现实世界的项目中可能不存在),如果你写的代码直接依赖于它们两者,只需要选择一个并丢弃另一个。
但您的代码可能间接依赖于它们。而且您不想更改代码(或尽可能少更改)。
一种解决方案是您自己编写ClassLoader 来同时使用:Possible to use two java classes with same name and same package?(我没有尝试过)
如果您选择加载正确的版本(包含这样的field),并且您的代码间接依赖于wrong 版本仍然可以工作(希望如此),那么我们有一个非常简单的解决方案:让您的项目选择正确的版本。
以eclipse为例,你可以在Java Build Path属性中使用Order and Export 标签,只需调整顺序让正确的版本在wrong版本之前,因为Order部分的功能是:
一方面,它充当资源的解析顺序
用于构建相关项目(“订单”部分)。
如果那里没有显示正确的版本或错误的版本,您应该根据Export part 的功能确定它是什么包并调整其顺序。阅读The "Order and Export" tab in "Java Build Path"了解详情。