java - NoSuchMethodError 以及如何阅读

标签 java jenkins guava nosuchmethoderror

在 Jenkins 插件中执行一些 Java 代码,我得到以下结果:

Caused by: java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;II)V
    at de.dwpbank.build.jenkins.plugins.templateutility.auxconfig.ConfigHarvester.extract(ConfigHarvester.java:123)

我想知道如何完全理解 NoSuchMethodError 消息:

checkArgument(ZLjava/lang/String;II)V

我得到的是,我调用了 checkArgument 方法,至少有一个 String 作为参数,L 是指针的大小(Long - 不是吗?)但是 Z、分号后面的 II 是什么意思? V 代表什么?

这是关闭 checkArgument 的调用:

int maxBoundary = configDescriptorTree.getMaxBoundary();
int size = auxArray.length;

Preconditions.checkArgument(maxBoundary >= size,
                    "AuxInstance Array size '%s' > maxBoundary '%s'", size,
                    maxBoundary);

因此此调用将与 checkArgument 的以下签名匹配:

public static void checkArgument(boolean b, @Nullable String errorMessageTemplate, int p1, int p2)

通过自动装箱,它也可以匹配这个:

checkArgument(boolean b, @Nullable String errorMessageTemplate, @Nullable Object p1, @Nullable Object p2)

或者这个:

public static void checkArgument(boolean expression, @Nullable String errorMessageTemplate, @Nullable Object... errorMessageArgs)

这种歧义可能是 NoSuchMethodError 的原因吗?

我想知道我可以毫无问题地从 Jenkins 脚本控制台执行调用:

com.google.common.base.Preconditions.checkArgument(1 >= 2,
                    "AuxInstance Array size '%s' > maxBoundary '%s'", 2,
                    1);

结果

java.lang.IllegalArgumentException: AuxInstance Array size '2' > maxBoundary '1'

最佳答案

通常,此类错误消息与链接到错误版本的库依赖项有关。

de.dwpbank.build.jenkins.plugins.templateutility.auxconfig.ConfigHarvester的图书馆可能链接到您的 Jenkins 安装中不可用的 Google Guava 版本。

如果您想了解更多涉及哪些 jar 文件,您可以运行以下代码来定位 jar 文件:

public static void findJarForClass(Class clazz) {
    CodeSource src = clazz.getProtectionDomain().getCodeSource();
    if (src != null) {
        java.net.URL jar = src.getLocation();
        System.out.printf("%s ----> %s%n", clazz, jar);
    }
}

这个静态调用将指向您所涉及的类的 jar 文件。

如果您知道版本,您可以检查 de.dwpbank.build.jenkins.plugins.templateutility.auxconfig.ConfigHarvester 的 jar 文件,尤其是在 META-INF/maven 文件夹中,查看 pom.xml 文件关于其依赖项的说明。通常,此文件会将您指向预期的库 - 在您的情况下指向预期的 Guava 库版本。

关于java - NoSuchMethodError 以及如何阅读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46682744/

相关文章:

Java 程序内存不足

apache - jenkins 安装是否需要 Apache Web 服务器

Jenkins 核心 API 文档 : How to navigate to find detailed properties and methods?

java - 未指定 maxSize 时,Google Guava Cache 逐出 SIZE 条目

java - Guava vs Google Play服务:构建冲突

java - 从 Google Collections 中查找 Multiset 中的前 N ​​个元素?

java - 为什么箭头会击中玩家?我的世界模组 1.8

java - 组布局中的 JLabel - 卡住大小

缺乏响应能力的 Java 鼠标监听器

jenkins - CVS 结帐,无需所有额外文件夹