2つの互換性のないプロジェクト(ElasticsearchとNeo4j)が使用されているMavenを使用してプロジェクトをセットアップしようとしています。これらの2つのプロジェクトはいずれもLuceneを使用しますが、異なるバージョンと互換性がありません。それが判明したので、これは不可能です!幸いにも、私は実行時にElasticsearchとテスト時にNeo4jが必要です。だから理論的には、私はうまくいくはずです。でも僕はそうじゃない!java.lang.NoClassDefFoundErrorを解決する方法:クラスが実際にアクセス可能な間にorg/apache/logging/log4j/Logger
共有Lucenceパッケージの場合、Neo4jは古いバージョンを使用しています。そのため、<dependencyManager>
の古いバージョンを明示的に<scope>test</scope>
と命名しました。このように、多くのランタイムエラーが解決されました。私は
- :ので
java.lang.NoClassDefFoundError: org/apache/logging/log4j/Logger at org.elasticsearch.common.logging.Loggers.getLogger(Loggers.java:101) at org.elasticsearch.search.suggest.completion2x.Completion090PostingsFormat.<clinit>(Completion090PostingsFormat.java:78) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at java.lang.Class.newInstance(Class.java:442) at org.apache.lucene.util.NamedSPILoader.reload(NamedSPILoader.java:72) at org.apache.lucene.util.NamedSPILoader.<init>(NamedSPILoader.java:51) at org.apache.lucene.util.NamedSPILoader.<init>(NamedSPILoader.java:38) at org.apache.lucene.codecs.PostingsFormat$Holder.<clinit>(PostingsFormat.java:49) at org.apache.lucene.codecs.PostingsFormat.forName(PostingsFormat.java:112) at org.apache.lucene.codecs.lucene54.Lucene54Codec.<init>(Lucene54Codec.java:161) at org.apache.lucene.codecs.lucene54.Lucene54Codec.<init>(Lucene54Codec.java:81) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at java.lang.Class.newInstance(Class.java:442) at org.apache.lucene.util.NamedSPILoader.reload(NamedSPILoader.java:72) at org.apache.lucene.util.NamedSPILoader.<init>(NamedSPILoader.java:51) at org.apache.lucene.util.NamedSPILoader.<init>(NamedSPILoader.java:38) at org.apache.lucene.codecs.Codec$Holder.<clinit>(Codec.java:47) at org.apache.lucene.codecs.Codec.getDefault(Codec.java:140) at org.apache.lucene.index.LiveIndexWriterConfig.<init>(LiveIndexWriterConfig.java:120) at org.apache.lucene.index.IndexWriterConfig.<init>(IndexWriterConfig.java:140) at org.neo4j.kernel.api.impl.index.IndexWriterConfigs.standard(IndexWriterConfigs.java:69) at org.neo4j.kernel.api.impl.index.partition.WritableIndexPartitionFactory.createPartition(WritableIndexPartitionFactory.java:45) at org.neo4j.kernel.api.impl.index.AbstractLuceneIndex.open(AbstractLuceneIndex.java:98) ...
これは、全く私には意味がありません。しかし、今、私が言ってElasticsearchのファイル内で、テストを実行している
NoClassDefFoundError
例外に直面していますElasticsearchをまったく呼び出さない(私のテストではint i = 0;
しか持っていない)。 org/apache/logging/log4j/Logger
クラスが利用可能であることを確認するために、私はテストクラスにスタティックロガーをインスタンス化しました。このとき、クラスは見つかりました:final static org.apache.log4j.Logger logger = Logger.getLogger(ApplicationTests.class);
面白いことに、この静的ロガーオブジェクトは、Elasticsearchのコードで例外がスローされる前に!
なぜこの例外に直面しているのですか?
問題を示すために、私はthis projectをGitHub上に作成しました。これを複製できます。テストdummyTest
を試してみてください。例外が表示されます。