使用--add-modules=jdk.incubator.vector时JUnit测试无法通过Maven运行
解决Maven构建中JUnit测试无法加载jdk.incubator.vector的问题
问题概述
在Maven构建的Java应用中引入SIMD代码后,通过指定参数的mvn exec:java命令和Eclipse都能正常运行程序,但执行mvn install时JUnit测试抛出类找不到异常,无法加载jdk.incubator.vector.Vector。
已完成的配置
- 运行程序的命令:
mvn exec:java -Dexec.mainClass="com.path.to.app.MainClass" -Dexec.classpathScope=runtime -Dexec.systemProperties="-da --add-modules=jdk.incubator.vector"
- 创建
.mvn/jvm.config文件,内容:
--add-modules=jdk.incubator.vector
- 在
pom.xml中配置maven-compiler-plugin(编译阶段):
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.10.1</version> <configuration> <compilerArgs> <arg>--add-modules=jdk.incubator.vector</arg> </compilerArgs> </configuration> </plugin>
错误详情
java.lang.NoClassDefFoundError: jdk/incubator/vector/Vector ... Caused by: java.lang.ClassNotFoundException: jdk.incubator.vector.Vector at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
环境信息
- OpenJDK 19
- Maven 3.8.6
- Ubuntu 20.04
- JUnit 4.13.2依赖配置:
<junit.version>4.13.2</junit.version> ... <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency>
解决方法
问题根源是JUnit测试阶段未传入--add-modules=jdk.incubator.vector参数——maven-compiler-plugin仅负责编译阶段,而测试阶段由maven-surefire-plugin管控,需要单独配置该插件添加JVM参数:
在pom.xml的project/build/plugins节点下添加以下配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.0.0-M7</version> <!-- 可使用与当前Maven兼容的最新版本 --> <configuration> <argLine>--add-modules=jdk.incubator.vector</argLine> </configuration> </plugin>
补充说明
.mvn/jvm.config的配置理论上会作用于Maven所有阶段,但部分环境或Maven版本可能存在兼容性问题,直接配置surefire插件是更可靠的方式,确保测试运行时能正确加载孵化模块。
配置完成后,先执行mvn test验证测试是否通过,再运行mvn install即可完成构建。
内容的提问来源于stack exchange,提问作者Serge Rogatch
相关产品推荐
相关产品推荐

