使用Maven与IDEA时,JUnit 5无法运行含Java 21预览语法的测试
问题:JUnit 5测试中使用Java 21匿名变量
_执行报错 编译通过但执行测试时抛出SurefireBooterForkException,核心错误为Illegal field name "" in class com/model/ConfTest。
报错详情
[ERROR] Please refer to /home/target/surefire-reports for the individual test results. [ERROR] Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream. [ERROR] There was an error in the forked process [ERROR] Illegal field name "" in class com/model/ConfTest [ERROR] org.apache.maven.surefire.booter.SurefireBooterForkException: There was an error in the forked process [ERROR] Illegal field name "" in com/model/ConfTest [ERROR] at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:628) [ERROR] at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:285) [ERROR] at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:250) [ERROR] at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:1203) [ERROR] at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:1055) [ERROR] at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:871) [ERROR] at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137) [ERROR] at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2(MojoExecutor.java:370) [ERROR] at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute(MojoExecutor.java:351) [ERROR] at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:215) [ERROR] at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:171) [ERROR] at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:163) [ERROR] at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117) [ERROR] at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81) [ERROR] at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56) [ERROR] at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128) [ERROR] at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:294) [ERROR] at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192) [ERROR] at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105) [ERROR] at org.apache.maven.cli.MavenCli.execute(MavenCli.java:960) [ERROR] at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:293) [ERROR] at org.apache.maven.cli.MavenCli.main(MavenCli.java:196) [ERROR] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) [ERROR] at java.base/java.lang.reflect.Method.invoke(Method.java:580) [ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282) [ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225) [ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406) [ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347)
原Maven构建配置
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <release>21</release> <compilerArgs><arg>--enable-preview</arg></compilerArgs> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.1.2</version> <configuration> <argLine>--enable-preview</argLine> </configuration> </plugin> </plugins> </build>
测试代码示例
@Test void test_with_(){ val l = List.of("a", "b", "c"); val l2 = l.stream().map(_ -> "not work"); }
完整POM文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>example</artifactId> <version>1.0.0-SNAPSHOT</version> <properties> <vavr.version>0.10.4</vavr.version> <vertx-core.version>4.4.5</vertx-core.version> <commons-lang3.version>3.12.0</commons-lang3.version> <commons-validator.version>1.7</commons-validator.version> <java.version>21</java.version> <maven-compiler-plugin.version>3.11.0</maven-compiler-plugin.version> <lombok.version>1.18.30</lombok.version> <assertj-vavr.version>0.4.3</assertj-vavr.version> <awaitility.version>4.2.0</awaitility.version> <mockito-junit-jupiter.version>5.3.1</mockito-junit-jupiter.version> <junit-jupiter.version>5.10.0</junit-jupiter.version> <maven-surefire-plugin.version>3.1.2</maven-surefire-plugin.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>io.vavr</groupId> <artifactId>vavr</artifactId> <version>${vavr.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>io.vertx</groupId> <artifactId>vertx-core</artifactId> <version>${vertx-core.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>${commons-lang3.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>commons-validator</groupId> <artifactId>commons-validator</artifactId> <version>${commons-validator.version}</version> <exclusions> <exclusion> <!-- VULNERABILITY --> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> </exclusion> </exclusions> </dependency> <!-- TEST --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>${junit-jupiter.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>${junit-jupiter.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-vavr</artifactId> <version>${assertj-vavr.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.awaitility</groupId> <artifactId>awaitility</artifactId> <version>${awaitility.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-junit-jupiter</artifactId> <version>${mockito-junit-jupiter.version}</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- TEST --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-vavr</artifactId> </dependency> <dependency> <groupId>org.awaitility</groupId> <artifactId>awaitility</artifactId> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-junit-jupiter</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven-compiler-plugin.version}</version> <configuration> <release>${java.version}</release> <compilerArgs><arg>--enable-preview</arg></compilerArgs> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>${maven-surefire-plugin.version}</version> <configuration> <argLine>--enable-preview</argLine> </configuration> </plugin> </plugins> </build> </project>
问题原因
核心问题是Lombok版本过低:使用的Lombok 1.18.30不支持Java 21的预览特性——匿名变量_。编译过程中Lombok处理字节码时生成了空名称的字段,导致运行时Surefire插件检测到非法字段名,抛出异常。
解决方案
1. 升级Lombok版本
使用支持Java 21的Lombok版本,最低要求1.18.32,推荐使用最新稳定版(如1.18.34)。修改POM中的lombok.version属性:
<lombok.version>1.18.34</lombok.version>
2. 确保Maven插件适配
maven-compiler-plugin3.11.0已支持Java 21,无需修改maven-surefire-plugin3.1.2支持Java 21,但需保持--enable-preview参数配置正确,确保测试JVM启用预览特性
3. 验证修改
更新后重新执行mvn test,Java 21的匿名变量_即可正常在JUnit 5测试中使用。
内容的提问来源于stack exchange,提问作者lecogiteur
相关产品推荐
相关产品推荐

