我正在编写一个Java Web应用程序并放入Tomcat运行。
当我尝试使用JAR中包含的方法时(我确信它包含我需要的方法),它显示:
java.lang.NoSuchMethodError: com.couchbase.client.CouchbaseClient.asyncGetBulk(Ljava/util/Collection;)Ljava
但我试图通过-verbose:class
启动tomcat,我看到以下日志:
[Loaded net.spy.memcached.ops.VBucketAware from file:/.../apache-tomcat-5.5.30/webapps/.../WEB-INF/lib/spymemcached-2.8.2.jar]
[Loaded net.spy.memcached.protocol.binary.SingleKeyOperationImpl from file:/.../apache-tomcat-5.5.30/webapps/.../WEB-INF/lib/spymemcached-2.8.2.jar]
[Loaded net.spy.memcached.protocol.binary.GetOperationImpl from file:/.../apache-tomcat-5.5.30/webapps/.../WEB-INF/lib/spymemcached-2.8.2.jar]
Exception in thread "Thread-2139" java.lang.NoSuchMethodError: com.couchbase.client.CouchbaseClient.asyncGetBulk(Ljava/util/Collection;)Ljava/util/concurrent/Future
虽然spymemcached-2.8.2.jar包含该方法,但我不明白它失败的原因。
这就是我调用方法的方法:
Future<Map<String,Object>> f = client.asyncGetBulk(key);
感谢您的帮助。
更新1:
通过使用Pathai提供的@Narendra代码,我得到了以下结果
[
file:/.../WEB-INF/classes/,
file:/.../WEB-INF/lib/activation-1.1.jar,
file:/.../WEB-INF/lib/commons-codec-1.5.jar,
file:/.../WEB-INF/lib/commons-lang-2.2.jar,
file:/.../WEB-INF/lib/commons-logging-1.1.1.jar,
file:/.../WEB-INF/lib/couchbase-client-1.0.3.jar,
file:/.../WEB-INF/lib/jaxb-api-2.1.jar,
file:/.../WEB-INF/lib/jaxb-impl-2.1.9.jar,
file:/.../WEB-INF/lib/jettison-1.1.jar,
file:/.../WEB-INF/lib/netty-3.2.0.Final.jar,
file:/.../WEB-INF/lib/runtime-0.4.1.5.jar,
file:/.../WEB-INF/lib/spymemcached-2.8.2.jar,
file:/.../WEB-INF/lib/stax-api-1.0-2.jar,
file:/.../WEB-INF/lib/xxx_core.jar,
file:/.../WEB-INF/lib/xxx_couchbase.jar
]
它们不包含路径为com.couchbase.client.CouchbaseClient.asyncGetBulk
的文件
除了couchbase-client-1.0.3.jar。
更新2:
使用代码:
CodeSource codeSource = CouchbaseClient.class.getProtectionDomain().getCodeSource();
if (codeSource != null) {
log.debug(codeSource.getLocation());
}
CodeSource codeSource2 = net.spy.memcached.MemcachedClient.class.getProtectionDomain().getCodeSource();
if (codeSource2 != null) {
log.debug(codeSource2.getLocation());
}
我得到以下结果:
file:/.../WEB-INF/lib/couchbase-client-1.0.3.jar
file:/.../WEB-INF/lib/spymemcached-2.8.2.jar
它们似乎也是正确的。
答案 0 :(得分:2)
问题是类路径
public static void main(String[] args) {
URLClassLoader classLoader = (URLClassLoader)Main.class.getClassLoader();
System.out.println(Arrays.toString(classLoader.getURLs()));
}
在Main类中使用此方法可以找出所有jar依赖项的解析位置。
查看类加载器是否正在加载旧版本的jar
答案 1 :(得分:1)
我有类似的问题,但有一个我自己的库,但感谢@Narendra Pathai提交的代码
URLClassLoader classLoader = (URLClassLoader)Main.class.getClassLoader();
System.out.println(Arrays.toString(classLoader.getURLs()));
我发现classpath正在使用我的库的一些非常旧的版本。
然后我清理构建文件夹(因为我正在使用gradle),所有编译并运行正常。
答案 2 :(得分:0)
可能有一个具有相同规范名称的类,它位于类路径的上方。
JVM选择第一个类,但没有找到所需的方法。检查类路径中是否有同一个库的多个版本
答案 3 :(得分:0)
您是否尝试将Couchbase依赖项放在$ TOMCAT_HOME / lib中,仅用于测试。
将其从WAR中删除
答案 4 :(得分:0)
如果您使用java -Dloader.path='dependency_jar_dir'
运行jar,并且有多个版本不同的jar(例如:com.a.1.1.jar,com.a.1.2.jar),那将是错误的!