使用具有surefire和failsafe功能的预览功能运行测试时出现问题

时间:2019-03-22 16:19:39

标签: java maven maven-surefire-plugin maven-failsafe-plugin java-12

我正在尝试使用--enable-preview将项目迁移到Java 12。

我在编译器设置中添加了--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 / failsafe配置中,但是结果是相同的。

我在这里想念什么?

这是surefire / failsafe中的错误吗?

EDIT2: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> 

EDIT3: 最小的工作示例在这里:https://github.com/krzyk/lombok-jdk10-example

该项目以--enable-preview失败,但是当我将其删除时可以正常工作。

3 个答案:

答案 0 :(得分:4)

有两种解决方案:

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

Explanation by the maintainer of 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中执行过滤,但这是非常复杂的更改,仍然存在疑问。

问题是我使用了forkCount,看来surefire没有将参数传递给fork中运行的JVM。

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

这当然会导致测试在单个JVM中运行,因此,如果您想使用fork来加速测试,那么它将无法正常工作。

答案 1 :(得分:4)

这对我有用:

  • mvn clean install可以使用(通过junit测试)
  • IDEA正确识别模块语言级别为12 (Preview) - Switch expressions
  • 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"
    

答案 2 :(得分:3)

为surefire和failsafe插件添加配置

<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>