对于 Junit 5 测试用例,Maven surefire 插件 2.22.2 构建失败,错误不支持 class file major version 56 in spring boot

Maven surefire plugin 2.22.2 build fails for Junit 5 test cases with errror Unsupported class file major version 56 in spring boot

Spring 启动应用程序 2.1 的 Junit 5 测试用例。7.RELEASE 构建失败,在 intelij 中出现以下错误。

[ERROR] 无法执行目标 org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test (default-test) on project domain: Execution default-test of goal org.apache.maven.plugins: maven-surefire-plugin:2.22.2:test failed: Unsupported class file major version 56 -> [Help 1]

使用java9模块化

应用程序在 maven 中构建,无需测试用例即可运行。

使用maven surefire插件版本2.22.1 在命令行和 intellij 中失败

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <useSystemClassLoader>false</useSystemClassLoader>
            </configuration>
        </plugin>



        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <jvmArguments>--add-modules=java.xml.ws.annotation</jvmArguments>
            </configuration>
        </plugin>

在 Maven 构建中执行的 JVM 不是您认为的那样。您需要 Java 12 来执行编译后的代码,而且由于某种原因,Maven 似乎使用 Java 11.

从错误日志可以看出子模块使用的是maven-surefire-plugin 2.22.2 解决方案是定义所有模块使用的 Maven 插件版本,将此部分添加到主 pom.xml:

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M3</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <release>12</release>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

我可以在删除 Oracle 依赖项后编译它,我不知道你是否需要这样做。如果它对你有用,请在问题中发表评论。

这是由于maven-surefire-plugin依赖的旧版本asm造成的

如果您 运行 使用 mvn test-X 构建 Maven,您应该会看到插件使用了 6.x 版本的 asm。

旧版本无法在较新的字节码上使用反射,独立于执行运行时间,这才是真正导致该问题的原因。

试试这个,对我有用:

       <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
            <dependencies>
                <dependency>
                    <groupId>org.ow2.asm</groupId>
                    <artifactId>asm</artifactId>
                    <version>7.3.1</version>
                </dependency>
            </dependencies>
        </plugin>

您可能需要将其添加到父 pom 的依赖管理配置中,以确保它正确应用于所有子项目。