Krz*_*soń 9 java maven maven-surefire-plugin maven-failsafe-plugin java-12
我正在尝试使用将项目迁移到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>
Run Code Online (Sandbox Code Playgroud)
并在argLine中添加了它,以确保surefire和failsafe:
<properties>
<argLine>--enable-preview</argLine>
</properties>
Run Code Online (Sandbox Code Playgroud)
并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]
Run Code Online (Sandbox Code Playgroud)
我也尝试将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>
Run Code Online (Sandbox Code Playgroud)
EDIT3:最小的工作示例在这里:https : //github.com/krzyk/lombok-jdk10-example
该项目失败,出现--enable-preview,但将其删除后可以正常工作。
jd_*_*cde 27
这对我有用:
mvn clean install 工作(使用junit测试)12 (Preview) - Switch expressions <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>
Run Code Online (Sandbox Code Playgroud)
环境:
jdk:
IMPLEMENTOR="Oracle Corporation"
JAVA_VERSION="12"
JAVA_VERSION_DATE="2019-03-19"
Run Code Online (Sandbox Code Playgroud)附加:类似地,这种方法适用于 java 13。
有两种解决方案:
添加--enable-preview到MAVEN_OPTS环境变量。
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。
forkCount从surefire / failsafe配置中删除该参数。
当然,这将导致测试在单个JVM中运行,因此,如果您想使用fork来加速测试,那么它将无法正常工作。
小智 5
添加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>
Run Code Online (Sandbox Code Playgroud)