如何修复nosuchmethoderror?

bpzcxfmw  于 2021-07-24  发布在  Java
关注(0)|答案(24)|浏览(382)

我得到一个 NoSuchMethodError 运行java程序时出错。有什么问题,我该怎么解决?

ndasle7k

ndasle7k16#

我也犯了同样的错误:

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)

为了解决这个问题,我首先检查了模块依赖关系图( click in your POM the combination -> Ctrl+Alt+Shift+U 或者 right click in your POM -> Maven -> Show dependencies )了解图书馆之间的冲突到底发生在哪里(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>

具有不需要的版本的依赖项将从项目中排除。

gpfsuwkq

gpfsuwkq17#

对我来说,这是因为我将函数中的参数类型从object a改为string a。我可以解决它与清洁和建设再次

iqjalb3h

iqjalb3h18#

如果您正在编写webapp,请确保容器的全局库目录和应用程序中没有jar的冲突版本。您可能不一定知道类加载器正在使用哪个jar。
例如
tomcat/common/lib
mywebapp/web-inf/lib

ocebsuys

ocebsuys19#

这也可能是使用反射的结果。如果您有反映在类上并按名称提取方法的代码(例如:with Class.getDeclaredMethod("someMethodName", .....) )然后,每当方法名发生更改时(例如在重构期间),您都需要记住更新反射方法的参数以匹配新方法签名或 getDeclaredMethod 呼叫将抛出 NoSuchMethodException .
如果这是原因,那么堆栈跟踪应该显示调用反射方法的点,并且您只需要更新参数以匹配实际的方法签名。
根据我的经验,在单元测试私有方法/字段和使用 TestUtilities 类来提取用于测试验证的字段(通常使用的是没有考虑到单元测试的遗留代码。)

alen0pnh

alen0pnh20#

如果您使用maven或其他框架,并且几乎是随机地出现此错误,请尝试一个干净的安装,如。。。

clean install

如果您编写了对象,并且知道它有方法,那么这种方法尤其可能有效。

bybem2ql

bybem2ql21#

这通常是在使用apacheant这样的构建系统时造成的,该系统只在java文件比类文件更新时编译java文件。如果一个方法签名发生了变化,并且类使用的是旧版本,则可能无法正确编译。通常的修复方法是进行完全重建(通常是“ant clean”,然后是“ant”)。
有时,在对库的一个版本进行编译但在另一个版本上运行时,也会导致这种情况。

6ioyuze2

6ioyuze222#

如果您有权更改jvm参数,那么添加详细输出将允许您查看从哪个jar文件加载了哪些类。

java -verbose:class <other args>

程序运行时,jvm应转储到标准输出信息,例如:
...
[从文件:/c:/program%20files/junit3.8.2/junit.jar加载了junit.framework.assert]
...

cnjp1d6j

cnjp1d6j23#

注意,在反射的情况下,你会得到一个 NoSuchMethodException ,而使用非反射代码 NoSuchMethodError . 当我面对一个和另一个的时候,我倾向于去不同的地方寻找。

mi7gmzs6

mi7gmzs624#

我有你的问题,我就是这样解决的。以下步骤是添加库的有效方法。我已经正确地完成了前两个步骤,但是我没有通过将“.jar”文件直接从文件系统拖到eclipse项目的“lib”文件夹来完成最后一个步骤。此外,我还必须从构建路径和“lib”文件夹中删除库的早期版本。

步骤1-将.jar添加到构建路径

步骤2-关联源代码和javadocs(可选)

第3步-实际将.jar文件拖到“lib”文件夹中(不是可选的)

相关问题