2017-08-19 66 views
0

我想在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.javajava.lang.NoClassDefFoundError:组织/阿帕奇/日志/ log4j的/记录器

这里是代码

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核” % “2.8.2” 更新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", 
+0

为什么你添加log4j jar作为'test'依赖? – sunkuet02

+0

我在你的配置中看到你有log4j2和slf4j。你有什么打算呢? 1.将所有slf4j调用指向log4j2实现/ 2。将所有log4j2调用指向slf4j(并使用logback或其他)。这可能会影响答案。 –

+0

我正在使用“org.slf4j”%“slf4j-api”%“1.6.4”,用于登录我的应用程序,并添加了“org.apache.logging.log4j”%“log4j-core”%“2.8。 2" 只去除此异常 \t \t \t \t,但它并没有解决说明了问题 – swaheed

回答

1

,以解决您的问题,添加以下缺失的依赖性:

  • 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列出的依赖关系也会丢失一些东西。

+0

我正在使用slf4j的日志语句 – swaheed

+0

后,你的指令我得到这个异常当试图运行类名称套件遇到异常:org.scalatest.DeferredAbortedSuite *** *** ABORTED [信息] java.lang.NoClassDefFoundError:组织/阿帕奇/记录/ log4j的/记录器 [信息]在org.elasticsearch.common.logging.Loggers.getLogger(记录器.java:101) [info] at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:92) [info] at org.elasticsearch.bootstrap.BootstrapForTesting。 (BootstrapForTesting.java:78) – swaheed

+0

关于你的第一个评论回答:slf4j不写任何日志语句;它只是一个委托给实际实现的api。这就是我说我的假设是,你的slf4j调用你也想使用log4j2。关于第二条评论:请粘贴您更新的依赖关系配置。 –

-1

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> 
+0

误差由OP约为elasticsearch直接调用API的log4j(这是对依赖已列出)。所以问题可能是依赖关系配置,但不是添加slf4j绑定 –

+0

是的,你是对的@albert_nil – swaheed

相关问题