在surefire和failsafe中启用预览功能后运行测试时出现问题

27

我正在尝试将一个项目迁移到Java 12,并使用 --enable-preview

我在编译器设置中添加了 --enable-preview

        <plugin>                                                            
            <artifactId>maven-compiler-plugin</artifactId>                  
            <version>3.8.0</version>                                        
            <configuration>                                                 
                <release>12</release>                          
                <compilerArgs>                                                                                  
                    <arg>--enable-preview</arg>                             
                </compilerArgs>                                                                      
            </configuration>                                                
        </plugin>                                                                                                                                         

同时也在surefire和failsafe的argLine中添加了它:

<properties>                                                                                             
    <argLine>--enable-preview</argLine>                        
</properties> 

执行mvn clean verify的结果为:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:3.0.0-M3:test (default-test) on project lombok-jdk10: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:3.0.0-M3:test failed: java.lang.UnsupportedClassVersionError: Preview features are not enabled for com/kirela/lombok/BarTest (class file version 56.65535). Try running with '--enable-preview' -> [Help 1]

我也尝试直接将argLine添加到surefire/failsafe配置中,但结果相同。

我错过了什么?

这是surefire/failsafe的一个bug吗?

编辑2:Surefire和failsafe配置:

        <plugin>                                                            
            <groupId>org.apache.maven.plugins</groupId>                     
            <artifactId>maven-surefire-plugin</artifactId>                  
            <version>3.0.0-M3</version>                                     
            <configuration>                                                 
                <forkCount>2</forkCount>                                    
            </configuration>                                                
        </plugin>                                                           
        <plugin>                                                            
            <groupId>org.apache.maven.plugins</groupId>                     
            <artifactId>maven-failsafe-plugin</artifactId>                  
            <version>3.0.0-M3</version>                                     
            <executions>                                                    
                <execution>                                                 
                    <goals>                                                 
                        <goal>integration-test</goal>                       
                        <goal>verify</goal>                                 
                    </goals>                                                
                </execution>                                                
            </executions>                                                   
            <configuration>                                                 
                <forkCount>2</forkCount>                                    
            </configuration>                                                                                                                              
        </plugin> 

编辑3: 这里有一个最小工作示例:https://github.com/krzyk/lombok-jdk10-example

该项目在使用--enable-preview时失败,但在我删除它后可以运行。


最好提交一个带有调试日志的问题报告,其中包括Surefire尝试运行的确切命令行等效项。 - Naman
maven.compiler.sourcemaven.compiler.target属性的值是什么? - Izbassar Tolegen
现在似乎有一个版本为3.0.0-M6的surefire插件,这会有什么影响吗? - user944849
2
实际上中心库没有这个版本,而我需要使用它,最高的只有M3。 - Krzysztof Krasoń
1
您可以随时检查最新版本:https://maven.apache.org/plugins/ - khmarbaise
显示剩余2条评论
3个回答

37

以下方法适用于我:

  • mvn clean install 有效(包括junit测试)
  • IDEA 正确识别模块语言级别为 12 (预览) - Switch表达式
  • IDEA 中的junit测试有效
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
            <release>12</release>
            <compilerArgs>
                <arg>--enable-preview</arg>
            </compilerArgs>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.22.2</version>
        <configuration>
            <argLine>--enable-preview</argLine>
        </configuration>
    </plugin>

环境:

  • Ubuntu 18.04.3 x64

  • IDEA 2019.2.1

  • Maven 3.6.0

  • jdk:

 IMPLEMENTOR="Oracle Corporation"
 JAVA_VERSION="12"
 JAVA_VERSION_DATE="2019-03-19"

补充: 同样,这种方法也适用于 Java 13。

补充: 同样,这种方法也适用于 Java 17。


10

这里有两种解决方案:

MAVEN_OPTS环境变量添加--enable-preview

由surefire维护者解释

argLine无任何问题地完成了它的任务。 插件运行JUnit筛选器,最终选择在一个或多个JVM中运行的相关类。 因此,JUnit引擎会运行两次。一次在插件JVM中,另一次在分叉的JVM中。

由于类被编译为*.class文件的字节代码与Maven支持的Java运行时版本不同的主版本或次版本,因此此JRE会失败,因为Maven中的Java不了解字节码。所以,很奇怪的是,同一个JVM(javac)根据JVM选项生成了两个主版本,而来自相同JVM的java不了解它是不兼容的自身。虽然在分叉的JVM版本中完全正常,并且通过javac编译的类已被理解,因为javac和分叉的JVM使用相同的选项--enable-preview启动。 这与使用maven-compiler-plugin使用toolchain编译源代码并在Java 11中运行整个Maven构建的情况相同。因此,在Maven过程中,类将以更高版本(字节码)进行编译,而JRE无法理解。

我们希望重构提供程序并在分叉的JVM内执行筛选,但这是非常复杂的更改,并且仍然有问题。

问题在于我使用了forkCount参数,但似乎surefire没有将参数传递给分叉运行的JVM。

从surefire/failsafe配置中删除forkCount参数

这当然会导致测试在单个JVM中运行,所以如果您想通过分叉来加速测试,现在不起作用。


也许将 forkCount 设置为 0 会有所帮助。可能已经有类似的问题被报告了 - SUREFIRE-1528 - Naman
1
好的,但仍然没有解决我的问题,我希望每个 CPU 核心(1C)的 fork 计数为 1,我可以禁用 forking,但这会减慢我的测试速度。 - Krzysztof Krasoń
2
你必须在Surefire中使用<argLine>--enable-preview</argLine>,并在Maven编译器插件中使用<compilerArgs>--enable-preview</compilerArgs>。因此,在两个插件中启用预览模式,或在两个插件中禁用预览模式。如果只启用其中一个而不启用第二个,则无法正常工作。 - tibor17

4
为surefire和failsafe Maven插件添加配置。
<plugin>
   <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <argLine>--enable-preview</argLine>
    </configuration>
</plugin>
<plugin>
    <artifactId>maven-failsafe-plugin</artifactId>
    <configuration>
        <argLine>--enable-preview</argLine>
    </configuration>
</plugin>

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