1

Apache Camel 2.10.3 を使用するアプリケーションをテストしようとしたところ、インスタンス化されるとすぐにDefaultCamelContext次の例外が発生しました。

java.lang.NoSuchMethodError: org.slf4j.Logger.trace(Ljava/lang/String;Ljava/lang/Object;)V
    at org.apache.camel.impl.DefaultPackageScanClassResolver.<init>(DefaultPackageScanClassResolver.java:70)
    at org.apache.camel.impl.DefaultCamelContext.<init>(DefaultCamelContext.java:222)

slf4j-api-1.6.6(Camel 2.10.3 に同梱されているもの) がランタイム クラスパスにあることを確認しました。次に、SLF4J を使用しているが、別のバージョンに依存している別の依存関係があるのではないかと考えました。そこで、Eclipse を開き、タイプ検索を実行したところorg.slf4j.Logger、確かに、そのクラスが 2 つの異なる JAR にリストされていることがわかりましslf4j-api-1.6.6.jarwidget-lib-3.0.jar

を開いてwidget-lib3.0.jarみると、SLF4J が次のようにパッケージ化されていることがわかります。

widget-lib-3.0/
    com/
        <Widget Lib's compiled classes>
    org/
        slf4j/
            spi/
                ...
            impl/
                ...
            <A bunch of SLF4J classes, like LoggerFactory.class, etc.>

ここで使用している SLF4J のバージョンを特定する方法はありませんが、Camel 2.10.3 が必要としている 1.6.x より前のバージョンであると断言できます。

widget-lib-3.0.jar#org/slf4j/Loggerしたがって、実行時に JRE クラスローダが最初に見つけてロードし、次にCamel JAR とその依存関係をロードするというのが、私の最善の、少し知識に基づいた推測です。次に、DefaultPackageScanClassResolverSLF4J メソッドを呼び出すと、SLF4Jtrace(String,Object)の 1.6.6 バージョンが検出されず、むしろ、付属のバージョンが検出されwidget-lib-3.0.jar、そのメソッド/オーバーロードが存在しません。

私は基地から離れた道を進んでいますか?私が基地から外れている場合、これはあなたにとって何を意味しますか? そして、私が順調に進んでいる場合、提案された解決策はwidget-lib-3.0.jar、パッケージを含めずに再 JARorg/slf4jすることです (他に最新のバージョンは存在しません)。私の理論slf4j-api-1.6.6は、下位互換性がある がロードされる唯一の SLF4J バージョンであり、両方の JAR で機能するというものです。何かご意見は?前もって感謝します。

4

3 に答える 3

0

「ここで使用している SLF4J のバージョンを特定する方法はありませんが、Camel 2.10.3 が必要としている 1.6.x より前のバージョンであると断言できます」...

widget-lib-3.0.jar からクラス ファイルを逆コンパイルして、必要なメソッドがあるかどうかを確認してみませんか?

于 2013-02-01T11:00:38.083 に答える
0

あなたのアプローチは正しいものです。SLF4J 1.x は、バージョン間で API の互換性があります。(ちなみに Maven を使用していますか? これはまさにこの種の問題を防ぐように設計されています)。

とはwidget-lib? 依存関係を含まないバージョンはありますか? あるならそれを使えばいい。

于 2013-02-01T11:27:06.190 に答える
0

私は基地から離れた道を進んでいますか?

いいえ、順調に進んでいるようです。

それを確認する方法org.sfl4j.Loggerは、ウィジェット ライブラリ JAR で のコピーを取得し、それを使用してメソッドjavahがあるかどうかを確認することです。void trace(String, Object)

確認したら、いくつかの解決策があります。

  • 最もクリーンな解決策は、ウィジェット ライブラリのソース コードを入手し、必要なバージョンの sfl4j に対して再コンパイルし、sfl4j を埋め込まずに新しいバージョンの JAR をビルドすることです。(ウィジェット ライブラリのソースを変更する必要がある可能性はありますが、ほとんどありません)。

  • より簡単な解決策は、クラスパス上のウィジェット ライブラリ JAR の前に、新しい (そして後方互換性があると思われる) slf4 API JAR を配置することです。そうすれば、ウィジェット JAR 内の古いバージョンの slf4j は、Camel が必要とする追加のメソッドを備えた新しいバージョンによって「影付き」になります。

于 2013-02-01T11:34:10.377 に答える