在确保火力和故障安全的情况下运行启用了预览功能的测试时出现问题

我正在尝试将一个项目迁移到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>                                                                                                                                         

并且还在 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/failureafe 配置中,但结果是相同的。

我在这里错过了什么?

我是肯定火/故障安全中的错误吗?

编辑2:Surefire和故障安全配置:

        <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


答案 1

这对我有用:

  • mvn clean install作品(带朱尼特测试)
  • IDEA将模块语言级别正确识别为12 (Preview) - Switch expressions
  • IDEA工作中的朱尼特测试
    <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

  • 创意 2019.2.1

  • Maven 3.6.0

  • jdk:

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

补充:同样,此方法适用于java 13。

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


答案 2

有两种解决方案:

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

surefire的维护者的解释

argLine可以毫无问题地完成它必须做的事情。该插件运行JUnit过滤器,最终选择要在一个或多个JVM中运行的相关类。因此,JUnit 引擎运行了两次。一次在插件JVM中,第二次在分叉的JVM中。

由于这些类使用与 Maven 中 Java 运行时版本支持的主要或次要版本(在 *.class 文件的字节码中)进行编译,因此此 JRE 失败,因为 Maven 中的 Java 不理解字节码。因此,奇怪的是,同一个JVM(javac)根据JVM选项产生了两个主要版本,而来自同一JVM的java并不理解它本身是不兼容的。尽管分叉JVM中的版本是完全没问题的,并且理解javac编译的类,因为javac和分叉的JVM以相同的选项--enable-preview开头。这与使用工具链通过 maven-compiler-plugin 使用 Java 12 编译源代码并使用 Java 11 运行整个 Maven 构建的情况相同。因此,这些类将使用比JRE在Maven进程中可以理解的更高的版本(字节码)进行编译。

我们希望重新设计提供程序并在分叉的JVM内部执行过滤,但这是非常编译的更改,仍然值得怀疑。

问题是我用了,看起来surefire不会将参数传递给JVM在fork中运行。forkCount

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

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


推荐