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.jar
たwidget-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 とその依存関係をロードするというのが、私の最善の、少し知識に基づいた推測です。次に、DefaultPackageScanClassResolver
SLF4J メソッドを呼び出すと、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 で機能するというものです。何かご意見は?前もって感謝します。