![](/img/trans.png)
[英]Elasticsearch java api error 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)
...
这对我来说根本没有意义,因为:
int i = 0;
)。 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-simple
和log4j-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.