在运行我的Java程序时,我遇到了一个NoSuchMethodError
错误。出了什么问题?如何解决?
在运行我的Java程序时,我遇到了一个NoSuchMethodError
错误。出了什么问题?如何解决?
没有更多的信息,很难确定问题的根本原因,但最可能的原因是您对一个缺少方法的类的不同版本进行了编译,与在运行时使用的版本不同。
查看堆栈跟踪...如果在调用库中对象的方法时出现异常,则在编译和运行时可能使用了不同的库版本。确保两个地方都使用正确的版本。
如果在调用由您创建的类实例化的对象的方法时出现异常,则您的构建过程似乎存在问题。请确保您实际运行的类文件在编译时已更新。
需要注意的是,在反射的情况下,你会得到一个NoSuchMethodException
异常,而在非反射代码中,你会得到NoSuchMethodError
错误。当面临其中一种情况时,我倾向于在非常不同的地方进行查找。
如果您可以更改JVM参数,则添加详细输出应允许您查看从哪些JAR文件加载哪些类。
java -verbose:class <other args>
当你的程序运行时,JVM 应该向标准输出中转储信息,例如:
...
[从文件:/C:/Program%20Files/junit3.8.2/junit.jar加载了junit.framework.Assert]
...
如果您使用Maven或另一个框架,并且几乎随机地遇到此错误,请尝试像这样进行清理安装...
clean install
如果您编写了对象并且知道它有该方法,则特别可能会起作用。
通常,这是由于使用类似于Apache Ant的构建系统时发生的,该系统仅在Java文件比类文件新时编译Java文件。 如果方法签名更改且类正在使用旧版本,则可能无法正确编译。 通常的解决方法是进行完整的重建(通常为“ant clean”然后“ant”)。
有时,这也可能是编译针对一个库的一个版本,但运行另一个版本而导致的问题。
我遇到了相同的错误:
Exception in thread "main" java.lang.NoSuchMethodError: com.fasterxml.jackson.core.JsonGenerator.writeStartObject(Ljava/lang/Object;)V
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:151)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:292)
at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:3681)
at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3057)
在POM中单击组合键-> Ctrl+Alt+Shift+U
或右键单击POM -> Maven -> 显示依赖项
),以了解库之间的冲突发生在哪里(Intelij IDEA)。在我的情况下,我有不同版本的Jackson依赖关系。
1) 所以,我直接在项目的POM文件中明确添加了这两个版本中最高的版本-2.8.7。
在属性中:
<jackson.version>2.8.7</jackson.version>
作为依赖项:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
2) 但也可以使用依赖排除来解决。
与下面的示例原理相同:
<dependency>
<groupId>group-a</groupId>
<artifactId>artifact-a</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</exclusion>
</exclusions>
</dependency>
如果依赖项版本不符合要求,将从您的项目中排除该依赖项。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.0.0-M3</version>
<configuration>
<rules>
<dependencyConvergence />
</rules>
</configuration>
</plugin>
mvn enforcer:enforce
如果你正在编写一个Web应用程序,请确保你的容器全局库目录和应用程序中没有冲突的jar版本。你可能不知道类加载器正在使用哪个jar。
例如:
我遇到这个问题是因为我在函数中将参数类型从Object a更改为String a。我可以通过重新清理和构建来解决它。