java.lang.NoClassDefFoundError:org / apache / logging / log4j / core / Layout,同时使用ESIntegTestCase运行集成测试

问题描述 投票:0回答:1

我正在尝试为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 Testing Framework中的任何类时,才会发生这种情况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>

怎么了?

java elasticsearch pom.xml noclassdeffounderror
1个回答
0
投票

这是因为Elasticsearch(org.elasticsearch:elasticsearch)依赖于Log4J 2 API,而Elasticsearch Testing框架(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
© www.soinside.com 2019 - 2024. All rights reserved.