NoSuchMethodError 字面意思没有找到类中的方法,但是一般在项目中都通过定位都能找到对应的方法。很难排查出问题所在。
但是这个问题确实是方法找不到抛出的。一般都是因为JVM全盘委托机制 类加载器加载了一个低版本的jar包,然后却使用了高版本jar包的方法,在程序允许的时候抛出了这样的异常。
所以遇到这样的异常首先排查jar包是否冲突。
如果类路径比较多杂
以下的方法可以通过类查看所在的jar包的路径:
Class cls = null;
try {
cls = Class.forName("com.test.domain.Test");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (cls == null)
throw new IllegalArgumentException("null input: cls");
URL result = null;
final String clsAsResource = cls.getName().replace('.', '/').concat(
".class");
final ProtectionDomain pd = cls.getProtectionDomain();
// java.lang.Class contract does not specify if 'pd' can ever be null;
// it is not the case for Sun's implementations, but guard against null
// just in case:
if (pd != null) {
final CodeSource cs = pd.getCodeSource();
// 'cs' can be null depending on the classloader behavior:
if (cs != null)
result = cs.getLocation();
if (result != null) {
// Convert a code source location into a full class file location
// for some common cases:
if ("file".equals(result.getProtocol())) {
try {
if (result.toExternalForm().endsWith(".jar")
|| result.toExternalForm().endsWith(".zip"))
result = new URL("jar:".concat(
result.toExternalForm()).concat("!/")
.concat(clsAsResource));
else if (new File(result.getFile()).isDirectory())
result = new URL(result, clsAsResource);
} catch (MalformedURLException ignore) {
}
}
}
}
if (result == null) {
// Try to find 'cls' definition as a resource; this is not
// document.d to be legal, but Sun's implementations seem to //allow this:
final ClassLoader clsLoader = cls.getClassLoader();
result = clsLoader != null ? clsLoader.getResource(clsAsResource)
: ClassLoader.getSystemResource(clsAsResource);
}
System.out.println("指定的类jar包路径 " + result);