Maven Surefire测试失败:不支持的类文件主要版本61。

15

我正在使用Maven在IntelliJ中创建一个项目,但是当我运行mvn installmvn test来运行我编写的简单JUnit测试时,它会失败并显示以下错误:

Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test (default-test) on project Idlearn: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test failed: Unsupported class file major version 61 -> [Help 1]

我的pom.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<project>
    <modelVersion>4.0.0</modelVersion>

    <groupId>mimuw</groupId>
    <artifactId>Idlearn</artifactId>
    <version>1</version>
    <name>Idlearn</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- for platform independent encoding-->
        <junit.version>5.8.2</junit.version> <!-- the latest JUnit version -->
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>${junit.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.2</version>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>17</source>
                    <target>17</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

我觉得我已经尝试了网络上的所有可能解决方案,但都无济于事。

最初的问题是我的测试无法运行。命令mvn test会输出正在运行SomeClassTest,但实际上并没有运行其中包含的任何测试(所有测试都像我在许多在线教程中找到的一样创建)。看起来我缺少了maven-surefire,现在我就有了它。


1
"Unsupported class file major version" 总是意味着某个类是针对比你用来运行的Java版本更高的Java版本编译的。版本61表示Java 17(请参见https://dev59.com/Fmkv5IYBdhLWcg3wvDXq#11432195),这与您在`pom.xml`中的编译器版本相匹配。确保您也使用Java 17运行测试。查看java -version输出以及echo %JAVA_HOME%(Windows)或echo $JAVA_HOME(Linux)的输出。 - Rob Spoor
java -version 打印出了预期的 openjdk version "17.0.2" 2022-01-18 (...)echo $JAVA_HOME 打印出了一个空行……这很奇怪,因为我在 ~/.profile 中设置了 export JAVA_HOME="/usr/lib/jvm/java-17-openjdk-amd64" - Maurycyt
好的,我重置了系统,现在 echo $JAVA_HOME 正确地输出了预期的内容,但问题仍然存在。 - Maurycyt
所以一切都表明您正在使用Java 17,但仍然遇到了可怕的版本不匹配错误。恐怕我不知道发生了什么。您可以尝试使用最新的surefire插件里程碑版本(3.0.0-M5),但我怀疑这并不能解决任何问题。 - Rob Spoor
这个问题已经在org.apache.maven.plugins:maven-surefire-plugin版本3.0.0-M5中得到了修复。 - lealceldeiro
显示剩余3条评论
1个回答

11

以下是我在使用Java 17时的有效方法。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.ow2.asm</groupId>
            <artifactId>asm</artifactId>
            <version>9.1</version>
        </dependency>
    </dependencies>
</plugin>

早上升级到Java 18时,我必须同时升级asmv9.3。希望这有所帮助。

有趣。它有效。为什么?这背后的工作原理是什么? - lealceldeiro
1
我写下这个答案已经有一段时间了,但当maven遇到问题时,我必须启用verbose日志并跟踪堆栈跟踪到GitHub上的ASM源代码来理解底层问题。虽然我不记得具体内容,但我想你可以按照同样的方法进行操作。顺便说一句,这是Maven与Gradle之间的设计选择。 - Salathiel Genèse
似乎不太可能是Maven的设计选择。更可能的是某个测试框架正在运行自己的JVM实例来运行测试。 - Ondra Žižka
你让我再次搜索了一遍,@OndraŽižka。所以这是它在asm源代码中的位置 - https://gitlab.ow2.org/asm/asm/-/blob/master/asm/src/main/java/org/objectweb/asm/ClassReader.java#L199你应该检查一下gradle如何解决相同的问题 - 这取决于选择,但没有一个是特别出色的。 - Salathiel Genèse
1
好的,但这是ASM的设计选择,而不是Maven :) Maven Surefire插件使用了ASM,它恰好选择在未经测试的字节码版本上失败。不过,感谢您发现了这一点,这为我节省了很多时间 :) - Ondra Žižka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接