代码之家  ›  专栏  ›  技术社区  ›  BlackEye

NoSuchMethodError和如何读取

  •  0
  • BlackEye  · 技术社区  · 7 年前

    在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方法,其中至少有一个字符串作为参数,L是指针的大小(长-不是吗?)但是Z,分号后的II和V代表什么?

    以下是取消检查参数:

    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的原因吗?

    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 回复  |  直到 7 年前
        1
  •  3
  •   gil.fernandes    7 年前

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

    图书馆 de.dwpbank.build.jenkins.plugins.templateutility.auxconfig.ConfigHarvester 可能链接到谷歌Guava的一个版本,该版本在您的Jenkins安装中不可用。

    如果您想了解更多涉及哪些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文件。

    如果您知道可以检查的jar文件的版本 de.dwpbank。建筑詹金斯。插件。模板实用程序。auxconfig。配置收割机 ,尤其是在他们的META-INF/maven文件夹中,看看pom是什么。xml文件表示其依赖关系。通常,该文件将指向预期的库-在您的情况下,指向预期的Guava库版本。