我得到一个NoSuchMethodError错误时运行我的Java程序。出了什么问题,我该怎么解决?
当前回答
在我的案例中,问题是在构建路径中有相同库的两个版本。这个库的旧版本没有这个功能,新版本有。
其他回答
这通常是在使用像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>
不需要版本的依赖项将从项目中排除。
我也遇到过同样的问题。我改变了一个方法的返回类型,并运行了这个类的测试代码。这就是我面对这个NoSuchMethodError的时候。作为一种解决方案,在再次运行测试代码之前,我在整个存储库上运行了一次maven构建。这个问题在下一次测试运行中得到了解决。
来回答最初的问题。根据java文档:
"NoSuchMethodError"当应用程序试图调用类(静态或实例)的指定方法,而该类不再有该方法的定义时抛出。
通常,这个错误会被编译器捕获;只有当类的定义发生不兼容的更改时,此错误才会在运行时发生。
如果发生在运行时,检查包含该方法的类是否在类路径中。 检查是否添加了新版本的JAR,方法是否兼容。
NoSuchMethodError:我花了几个小时来修复这个问题,最终通过重命名包名来修复它,清洁和构建…尝试清洁构建首先,如果它不工作尝试重命名类名或包名和清洁构建…它应该被修复。祝你好运。
推荐文章
- 将JSON字符串转换为HashMap
- web - inf在Java EE web应用程序中用于什么?
- Java 8: Lambda-Streams,过滤方法与异常
- 将JsonNode转换为POJO
- 如何查看IntelliJ中的编译错误列表?
- Java SimpleDateFormat("yyyy-MM-dd' t ' hh:mm:ss' z '")给出的时区为IST
- 杰克逊克服下划线,支持骆驼案
- List、List<?>, List<T>, List<E>, List<Object>
- 在Java中转换字符串到日历对象
- 在java中使用wait()和notify()的简单场景
- 增强的for循环中的Null检查
- c# vs Java Enum(适合c#新手)
- 如何在不强制转换的情况下将double转换为long ?
- for循环和for-each循环在性能上有区别吗?
- 你如何比较两个版本的字符串在Java?