繁体   English   中英

如何在类实际可访问时解析java.lang.NoClassDefFoundError:org / apache / logging / log4j / Logger

[英]How to resolve java.lang.NoClassDefFoundError: org/apache/logging/log4j/Logger while the class is actually accessible

我正在尝试使用Maven设置一个项目,其中使用了两个不兼容的项目(Elasticsearch和Neo4j)。 这两个项目都使用Lucene但版本不同且不兼容。 事实证明这是不可能的! 幸运的是,我需要在运行时使用Elasticsearch,在测试时需要Neo4j。 所以从理论上讲,我应该没事。 但我不是!

对于共享的Lucence包,Neo4j使用了旧版本,因此我在<dependencyManager>使用<scope>test</scope>显式命名了旧版本。 以这种方式解决了许多运行时错误。 但现在,我面临一个运行测试的NoClassDefFoundError异常,在Elasticsearch的文件中说:

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)
...

这对我来说根本没有意义,因为:

  1. 我根本没有调用Elasticsearch(在我的测试中我只有一个int i = 0; )。
  2. 为了确保org/apache/logging/log4j/Logger类可用,我在我的测试类中实例化了一个静态记录器,这次找到了这个类: final static org.apache.log4j.Logger logger = Logger.getLogger(ApplicationTests.class); 有趣的是,在Elasticsearch的代码中抛出异常之前,这个静态logger对象已成功实例化!

知道我为什么要面对这个例外吗?

为了演示这个问题,我在GitHub上创建了这个你可以克隆的项目。 尝试并运行测试dummyTest ,您将看到异常。

您好在这里找到答案: 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM