20

我正在尝试将项目迁移到 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/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,但当我删除它时工作。

4

3 回答 3

27

这对我有用:

  • 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

  • 创意 2019.2.1

  • Maven 3.6.0

  • JDK:

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

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

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

于 2019-09-04T21:08:57.157 回答
8

有两种解决方案:

添加--enable-previewMAVEN_OPTS环境变量。

surefire 维护者的解释

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

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

我们希望重新设计提供程序并在分叉的 JVM 内部执行过滤,但这是非常复杂的更改并且仍然存在疑问。

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

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

这当然会导致测试在单个 JVM 中运行,因此如果您想使用分叉加速测试,现在它不会工作。

于 2019-03-23T08:30:16.943 回答
3

为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>
于 2021-02-06T21:49:13.633 回答