java.lang.NoClassDefFoundError : org/apache/logging/log4j/Logger 错误

标签 java scala unit-testing elasticsearch

我想在 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",

最佳答案

要解决您的问题,请添加以下缺少的依赖项:

  • 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 列出的依赖项也缺少一些东西。

关于java.lang.NoClassDefFoundError : org/apache/logging/log4j/Logger 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45768480/

相关文章:

java - 在 Apache HttpComponents 中获取重定向 URL

java - Java 中的类型 List 与类型 ArrayList

scala - 无法导入 scala.reflect.runtime.universe

java - Joda-Time 以不同的语言解析日期时间

java - 不区分大小写的 String.contains 方法的替代方法是什么?

scala - 为什么我要使用 type T = <type> 而不是 Trait[T]?

scala - 流畅的代码生成器和 > 22 列的表格

python - Django Formset 缺少管理表单数据

c++ - gmock - 测试模拟方法参数

perl - 模拟 Perl 的 Test::More::done_testing 最惯用的方法是什么?