NoSuchMethodError 以及如何阅读
NoSuchMethodError and how to read
在 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 是指针的大小(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
的库可能链接到 Google 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 文件 类。
如果您知道版本,您可以检查 de.dwpbank.build.jenkins.plugins.templateutility.auxconfig.ConfigHarvester
的 jar 文件,尤其是在他们的 META-INF/maven 文件夹中,并查看 pom.xml 文件关于其依赖项的内容。通常,此文件会将您指向预期的库 - 在您的情况下指向预期的 Guava 库版本。
在 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 是指针的大小(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
的库可能链接到 Google 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 文件 类。
如果您知道版本,您可以检查 de.dwpbank.build.jenkins.plugins.templateutility.auxconfig.ConfigHarvester
的 jar 文件,尤其是在他们的 META-INF/maven 文件夹中,并查看 pom.xml 文件关于其依赖项的内容。通常,此文件会将您指向预期的库 - 在您的情况下指向预期的 Guava 库版本。