java 11中的Junit测试类编译错误?

问题描述

我正在从 Java 8 迁移到 Java 11。我在执行 Maven 构建时遇到编译错误

    src
       main
           com
              A.class
    
       test
          com
            Atest.class
 Atest.java {
  A a;//compile error

}

pom.xml 中使用过插件

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <executions>
                    <execution>
                        <id>default-compile</id>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

我收到如下错误

[ERROR]   symbol:   class A
[ERROR]   location: class com.Atest
[ERROR] -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException:
Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:testCompile (default-testCompile)
on project 'ourproject': Compilation failure

我尝试添加 <release>11</release> ...但仍然遇到相同的错误。 我们需要在 pom 文件中额外添加什么来编译测试类?

解决方法

  1. Java 主类和测试类的标准目录是 src/main/javasrc/test/java,而不仅仅是 src/mainsrc/test,请参阅 Introduction to the Standard Directory Layout
  1. 在这些目录中是 Java 源文件 (*.java) 而不是编译的类文件 (*.class)。

  2. 为什么要在编译器插件上声明 <executions>?见Configuring Your Compiler Plugin

由于 Compiler Plugin 在它们的阶段自动执行,因此您不必像许多其他插件一样放置 executions

  1. Maven Surefire Plugin / Inclusions and Exclusions of Tests

默认情况下,Surefire 插件会自动包含所有具有以下通配符模式的测试类:

  • ...
  • "**/*Test.java" - 包括其所有子目录和所有以“Test”结尾的 Java 文件名。

我不确定 Atest.java 是否包含在此范围内。