在Java 9与Maven 3.5环境下执行单元测试及应用的问题
解决Java 9环境下Maven运行单元测试失败的问题
你猜的没错!核心问题确实是**--add-modules java.xml.bind参数只被加到了编译阶段,没传递到测试运行阶段**。Java 9开始JAXB相关模块(java.xml.bind)被从默认JDK类路径中移除,变成了可选模块——这就导致编译时能找到它,但运行单元测试时JVM找不到该模块,直接抛出异常。
下面给你两个可行的解决办法,按需选择:
方法一:统一配置编译和测试阶段的JVM参数
在你的pom.xml里,同时给负责编译的maven-compiler-plugin和负责运行测试的maven-surefire-plugin加上--add-modules java.xml.bind参数,确保编译和运行阶段都能加载这个模块:
<build> <plugins> <!-- 编译阶段配置 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <release>9</release> <compilerArgs> <arg>--add-modules</arg> <arg>java.xml.bind</arg> </compilerArgs> </configuration> </plugin> <!-- 测试运行阶段配置 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> <configuration> <argLine>--add-modules java.xml.bind</argLine> </configuration> </plugin> </plugins> </build>
方法二:引入独立JAXB依赖(长期推荐)
因为Java 9之后JAXB逐步从JDK中剥离,后续版本甚至完全移除,所以更稳妥的方式是直接引入JAXB的独立Maven依赖,彻底摆脱对JDK内置模块的依赖:
<dependencies> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.1</version> <scope>runtime</scope> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.0.1</version> </dependency> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency> </dependencies>
这种配置下,你完全不需要再加--add-modules参数,Maven会自动把这些依赖加入类路径,编译和测试运行都能正常工作。
配置完成后,重新执行mvn clean install,单元测试应该就能顺利通过了。
内容的提问来源于stack exchange,提问作者MiguelMunoz
相关产品推荐
相关产品推荐

