2

私は Java Web アプリを作成しており、Tomcat に入れて実行しています。

JAR に含まれているメソッド (必要なメソッドが含まれていると確信しています) を使用しようとすると、次のように表示されます。

java.lang.NoSuchMethodError: com.couchbase.client.CouchbaseClient.asyncGetBulk(Ljava/util/Collection;)Ljava

しかし、Tomcat を-verbose:classで起動しようとすると、次のログが表示されます。

[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:

@Narendra Pathai が提供するコードを使用すると、次の結果が得られました。

[
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

それらも正しいようです。

4

5 に答える 5

2

問題はクラスパスです

public static void main(String[] args) {
            URLClassLoader classLoader = (URLClassLoader)Main.class.getClassLoader();
            System.out.println(Arrays.toString(classLoader.getURLs()));
    }

Main クラスでこのメソッドを使用して、すべての jar 依存関係が解決されている場所を見つけます。

古いバージョンの jar がクラスローダーによってロードされているかどうかを確認します

于 2012-11-30T09:17:39.183 に答える
0

おそらく、クラスパスの上位に同じ正規名のクラスがあります。

JVM は最初のクラスを選択しますが、必要なメソッドが見つかりません。クラスパスに同じライブラリの複数のバージョンがあるかどうかを確認します

于 2012-11-30T09:16:53.287 に答える
0

最初にテストするためだけに、Couchbase の依存関係を $TOMCAT_HOME/lib に配置しようとしましたか。

そして、WARからそれらを削除します

于 2012-11-30T15:07:20.477 に答える