Java.lang.NoClassDefFoundError: org/apache/logging/log4j/Logger 这个错误意味着Java编译器无法找到org/apache/logging/log4j/Logger类,可能是由于缺少所需的jar文件或类路径不正确导致的。

3
我希望在Elasticsearch中执行单元测试,所以我正在使用Java-test-framework。同时,我正在使用Elasticsearch-1.6.0版本,并参考以下链接获取帮助: https://www.elastic.co/guide/en/elasticsearch/reference/1.6/using-elasticsearch-test-classes.html https://github.com/elastic/elasticsearch/blob/master/core/src/test/java/org/elasticsearch/action/search/SearchRequestBuilderTests.java 这是代码:
class CampaignESTest extends ESTestCase {

  def getCLient():MockTransportClient={
     val settings = Settings.builder()
                .put(Environment.PATH_HOME_SETTING.getKey(), Files.createTempDir().toString())
                .build();
     val client = new MockTransportClient(settings);  
     client
  }
 }

class CampaignTestSearch extends PlaySpec{
  val client=new CampaignESTest

val response = client.prepareSearch("dbtest")
      .setTypes(CAMPAIGN_COLLECTION_NAME)
      .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
      .addFields("uuid","campaignName","artworkID","activationDate","_source")
      .setQuery(query)
      .execute()
      .actionGet()
  }

我遇到了这个异常。
  DeferredAbortedSuite:
[info] Exception encountered when attempting to run a suite with class name: org.scalatest.DeferredAbortedSuite *** ABORTED ***
[info]   java.lang.NoClassDefFoundError: org/apache/logging/log4j/Logger
[info]   at org.elasticsearch.common.logging.Loggers.getLogger(Loggers.java:101)
[info]   at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:92)
[info]   at org.elasticsearch.bootstrap.BootstrapForTesting.<clinit>(BootstrapForTesting.java:78)
[info]   at org.elasticsearch.test.ESTestCase.<clinit>(ESTestCase.java:138)
[info]   at testcontrollers.campaign.CampaignTestSerach.<init>(CampaignTestSerach.scala:40)
[info]   at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
[info]   at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
[info]   at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
[info]   at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
[info]   at java.lang.Class.newInstance(Class.java:442)
[info]   ...
[info]   Cause: java.lang.ClassNotFoundException: org.apache.logging.log4j.Logger
[info]   at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
[info]   at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
[info]   at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
[info]   at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
[info]   at org.elasticsearch.common.logging.Loggers.getLogger(Loggers.java:101)
[info]   at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:92)
[info]   at org.elasticsearch.bootstrap.BootstrapForTesting.<clinit>(BootstrapForTesting.java:78)
[info]   at org.elasticsearch.test.ESTestCase.<clinit>(ESTestCase.java:138)
[info]   at testcontrollers.campaign.CampaignTestSerach.<init>(CampaignTestSerach.scala:40)
[info]   at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
[info]   ...
[error] Uncaught exception when running testcontrollers.campaign.CampaignTestSerach: java.lang.NoClassDefFoundError: org/apache/logging/log4j/Logger

在这一行代码上出现了异常。
val client=new CampaignESTest

CampaignTestSearch 类中

以下是 build.sbt 文件中的依赖项

   "org.slf4j" % "slf4j-api" % "1.6.4",
                "org.elasticsearch" % "elasticsearch" % "1.6.0",
                "org.elasticsearch.test" % "framework" % "5.0.0" % "test",
                "org.apache.lucene" % "lucene-test-framework" % "4.10.4" % "test",
                "com.carrotsearch.randomizedtesting" % "randomizedtesting-runner" % "1.6.0" % "test",
                "org.apache.lucene" % "lucene-codecs" % "4.10.4" % "test",
                "org.apache.logging.log4j" % "log4j-core" % "2.8.2" ,
"org.apache.lucene" % "lucene-expressions" % "4.10.4",

我怀疑异常的原因可能是某些依赖版本的问题。请问有人可以帮忙确定正确的库依赖版本来解决问题吗?或者我还漏掉了其他什么东西吗? 编辑:从"org.apache.logging.log4j" % "log4j-core" % "2.8.2"中删除了"test"。 更新build.sbt
"org.slf4j" % "slf4j-api" % "1.6.4",
                "org.elasticsearch" % "elasticsearch" % "1.6.0",
                "org.elasticsearch.test" % "framework" % "5.0.0" % "test",
                "org.apache.lucene" % "lucene-test-framework" % "4.10.4" % "test",
                "com.carrotsearch.randomizedtesting" % "randomizedtesting-runner" % "1.6.0" % "test",
                "org.apache.lucene" % "lucene-codecs" % "4.10.4" % "test",
                "org.apache.logging.log4j" % "log4j-core" % "2.8.2",
                "org.apache.logging.log4j" % "log4j-slf4j-impl" % "2.8.2" ,
                "org.apache.lucene" % "lucene-expressions" % "4.10.4",

为什么你将log4j jar包添加为“test”依赖项? - sunkuet02
我在你的配置中看到你同时使用了log4j2和slf4j。你对此有何意图?1.将所有的slf4j调用直接指向log4j2实现/2.将所有的log4j2调用直接指向slf4j(并使用logback或其他)。这可能会影响答案。 - albert_nil
我在我的应用程序中使用“org.slf4j”%“slf4j-api”%“1.6.4”进行日志记录,并添加了“org.apache.logging.log4j”%“log4j-core”%“2.8.2”仅用于消除此异常,但它并没有解决问题。 - swaheed
2个回答

9
为了解决您的问题,请添加以下缺失的依赖项:
  • org.apache.logging.log4j:log4j-api:2.8.2
此外,为了让您自己调用slf4j api时也被重定向到log4j2实现,请添加以下依赖项:
  • org.apache.logging.log4j:log4j-slf4j-impl:2.8.2
请确保类路径上没有其他日志实现。
注意:我提出的“额外”建议是基于您想将所有日志调用重定向到log4j中,无论您是调用slf4j api还是直接调用log4j。如果不是这样,请声明您想要哪种日志实现,因为OP列出的依赖关系也缺少一些内容。

我正在使用SLF4J来记录日志声明。 - swaheed
按照您的指示操作后,我遇到了以下异常:尝试运行类名为org.scalatest.DeferredAbortedSuite的套件时遇到了异常 *** ABORTED *** [info] java.lang.NoClassDefFoundError: org/apache/logging/log4j/Logger [info] at org.elasticsearch.common.logging.Loggers.getLogger(Loggers.java:101) [info] at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:92) [info] at org.elasticsearch.bootstrap.BootstrapForTesting.<clinit>(BootstrapForTesting.java:78) - swaheed
关于你对答案的第一条评论:slf4j 不会写任何日志语句; 它只是一个委托实际实现的 API。这就是我说你想要使用 log4j2 来处理 slf4j 调用的原因。关于第二条评论:请粘贴您更新后的依赖配置。 - albert_nil
你缺少我列出的第一个关于log4j-api的依赖。 - albert_nil
@alber_nil,您能否也看一下这个问题?这将是非常感激的帮助。https://dev59.com/O-k5XIcBkEYKwwoY9-p1 - swaheed

0

Caused By: Cause: java.lang.ClassNotFoundException: org.apache.logging.log4j.Logger 错误表示,JVM 在您的项目或应用程序 CLASSPATH 中找不到 org.apache.log4j.Logger 类。错误的原因可能是缺少 log4j.jar 文件。因此,您需要使用以下依赖项:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>

OP解释的错误是关于elasticsearch直接调用log4j API(已列在依赖项中)。因此,问题可能在于依赖项配置,而不是添加slf4j绑定。 - albert_nil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接