对于 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 的依赖管理配置中,以确保它正确应用于所有子项目。
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 的依赖管理配置中,以确保它正确应用于所有子项目。