2017-03-31 11 views
1

2つの互換性のないプロジェクト(ElasticsearchとNeo4j)が使用されているMavenを使用してプロジェクトをセットアップしようとしています。これらの2つのプロジェクトはいずれもLuceneを使用しますが、異なるバージョンと互換性がありません。それが判明したので、これは不可能です!幸いにも、私は実行時にElasticsearchとテスト時にNeo4jが必要です。だから理論的には、私はうまくいくはずです。でも僕はそうじゃない!java.lang.NoClassDefFoundErrorを解決する方法:クラスが実際にアクセス可能な間にorg/apache/logging/log4j/Logger

共有Lucenceパッケージの場合、Neo4jは古いバージョンを使用しています。そのため、<dependencyManager>の古いバージョンを明示的に<scope>test</scope>と命名しました。このように、多くのランタイムエラーが解決されました。私は

  1. :ので

    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;しか持っていない)。

  2. org/apache/logging/log4j/Loggerクラスが利用可能であることを確認するために、私はテストクラスにスタティックロガーをインスタンス化しました。このとき、クラスは見つかりました:final static org.apache.log4j.Logger logger = Logger.getLogger(ApplicationTests.class);面白いことに、この静的ロガーオブジェクトは、Elasticsearchのコードで例外がスローされる前に!

なぜこの例外に直面しているのですか?

問題を示すために、私はthis projectをGitHub上に作成しました。これを複製できます。テストdummyTestを試してみてください。例外が表示されます。

答えて

2

こんにちは、ここで答えを見つけた: https://discuss.elastic.co/t/issue-with-elastic-search-5-0-0-noclassdeffounderror-org-apache-logging-log4j-logger/64262/3

log4jの2.7 ElasticSearch 5.0.0で動作しないようです。また、ライブラリーslf4j-simplelog4j-to-slf4jには、log4j-apiと一緒に依存関係を追加する必要があります。

  • log4j-apiバージョン2.8.2
  • slf4j-simpleバージョン1.7.25
  • log4j-to-slf4jバージョン2.8.2
  • elasticsearchバージョン5.4.0

は私にとって、それはで働きました

関連する問題