java.lang.NoClassDefFoundError : org/apache/logging/log4j/core/Layout while running integration test using ESIntegTestCase

标签 java elasticsearch pom.xml noclassdeffounderror

我正在尝试使用 Java 为 ElasticSearch 设置集成测试。

我扩展了ESIntegTestCase并尝试运行一个虚拟的空测试。 测试结果是我得到了这个异常:

java.lang.NoClassDefFoundError: org/apache/logging/log4j/core/Layout
    at java.base/java.lang.Class.getDeclaredMethods0(Native Method)
    at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3166)
    at java.base/java.lang.Class.getMethodsRecursive(Class.java:3307)
    at java.base/java.lang.Class.getMethod0(Class.java:3293)
    at java.base/java.lang.Class.getMethod(Class.java:2106)
    at org.apache.maven.surefire.util.ReflectionUtils.tryGetMethod(ReflectionUtils.java:60)
    at org.apache.maven.surefire.common.junit3.JUnit3TestChecker.isSuiteOnly(JUnit3TestChecker.java:65)
    at org.apache.maven.surefire.common.junit3.JUnit3TestChecker.isValidJUnit3Test(JUnit3TestChecker.java:60)
    at org.apache.maven.surefire.common.junit3.JUnit3TestChecker.accept(JUnit3TestChecker.java:55)
    at org.apache.maven.surefire.common.junit4.JUnit4TestChecker.accept(JUnit4TestChecker.java:53)
    at org.apache.maven.surefire.util.DefaultScanResult.applyFilter(DefaultScanResult.java:102)
    at org.apache.maven.surefire.junit4.JUnit4Provider.scanClassPath(JUnit4Provider.java:309)
    at org.apache.maven.surefire.junit4.JUnit4Provider.setTestsToRun(JUnit4Provider.java:189)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:132)
    at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:379)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:340)
    at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:125)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:413)
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.core.Layout
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 18 more

仅当我运行任何测试或尝试构建模块,而测试类扩展了 Elasticsearch 测试框架中的任何类(在本例中为 ESIntegTestCase)时,才会发生这种情况。 如果测试类没有扩展任何东西 - 测试运行得很好。

这是我的 POM:

    <dependencies>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.4.1</version>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>6.4.1</version>                    
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <version>3.1.1.RELEASE</version>            
            <type>jar</type>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.groupid</groupId>
            <artifactId>myModule0</artifactId>
            <version>1.0-SNAPSHOT</version>
            <type>jar</type>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.data</groupId>
                    <artifactId>spring-data-elasticsearch</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.groupid</groupId>
            <artifactId>myModule1</artifactId>
            <version>1.0-SNAPSHOT</version>
            <type>jar</type>
            <exclusions>
                <exclusion>
                    <groupId>org.elasticsearch</groupId>
                    <artifactId>elasticsearch</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.elasticsearch.client</groupId>
                    <artifactId>transport</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework.data</groupId>
                    <artifactId>spring-data-elasticsearch</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.elasticsearch.test</groupId>
            <artifactId>framework</artifactId>
<!--  tried different versions, nothing seem to resolve this-->
            <version>7.6.1</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

它也是一个模块的子级,它遵循 spring-boot-starter-web:2.0.5.RELEASE 的排除:

          <exclusions>
                <exclusion>
                    <groupId>org.elasticsearch</groupId>
                    <artifactId>elasticsearch</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.elasticsearch.client</groupId>
                    <artifactId>transport</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework.data</groupId>
                    <artifactId>spring-data-elasticsearch</artifactId>
                </exclusion>
            </exclusions>

有什么问题吗?

最佳答案

这是因为 Elasticsearch (org.elasticsearch:elasticsearch) 依赖于 Log4J 2 API,而 Elasticsearch 测试框架 (org.elasticsearch.test:framework) 依赖于 Elasticsearch。在测试类路径中导入 Log4J 2 Core(实现)应该可以解决问题:

<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-core</artifactId>
  <version>2.11.1</version><!-- Elasticsearch v7.6.2 -->
  <scope>test</scope>
</dependency>

https://github.com/elastic/elasticsearch/blob/v7.6.2/buildSrc/version.properties#L19

您可以通过检查 Maven 项目依赖关系来找到这种关系:

mvn dependency:tree

关于java.lang.NoClassDefFoundError : org/apache/logging/log4j/core/Layout while running integration test using ESIntegTestCase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60763786/

相关文章:

java - 放置自动完成 fragment - 二进制 XML 文件行 #19 : Error inflating class fragment

hadoop - 基于点击流数据的访问者/用户分析?

elasticsearch - ElasticSearch查询未返回确切的字符串

java - 如何将本地 .m2 存储库的所有 Artifact 发布到 jfrog 存储库

java - Netbeans,无法保存我对项目文件所做的编辑

Maven 发布插件在发布标签下添加主干文件夹以发布 :prepare goal

java - Netty channel 写入未到达处理程序

java - 如何从 JSON 字符串中获取特定值

java - Thread.sleep(long mills) 也延迟了以前的方法

elasticsearch - 如何对 'alphabetically'中的 'buckets'排序聚合函数