NoSuchMethodError以及如何阅读

时间:2017-10-11 07:52:09

标签: 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'

1 个答案:

答案 0 :(得分:3)

通常,这种错误消息与链接到错误版本的库依赖关系有关。

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库版本。