Java8升级至Java17后maven-jaxb2-plugin执行失败求助
解决Java 17升级后maven-jaxb2-plugin的JAXB报错问题
问题核心
报错提示缺失com.sun.xml.bind.api.ErrorListener类,根源在于:
- Java 9+移除了JDK内置的JAXB模块,需显式引入第三方JAXB实现
- 旧版本maven-jaxb2-plugin依赖的JAXB版本过低,不兼容Java 17
- 插件配置存在语法错误,导致构建逻辑异常
- 项目依赖与插件运行时依赖相互隔离,仅添加项目依赖无法解决插件执行阶段的类缺失问题
具体修复步骤
1. 修正插件配置语法并升级版本
你修改后的配置存在标签嵌套错误(schemaIncludes内错误嵌套includes)和路径匹配错误(*..wsdl应为*.wsdl),同时未闭合标签。以下是修正后的完整插件配置,同时升级到兼容Java 17的稳定版本:
<plugin> <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>maven-jaxb2-plugin</artifactId> <!-- 使用兼容Java17的最新稳定版 --> <version>0.15.3</version> <executions> <execution> <id>WSDL2JAVA</id> <goals> <goal>generate</goal> </goals> <configuration> <schemaDirectory>config</schemaDirectory> <schemaLanguage>WSDL</schemaLanguage> <schemaIncludes> <include>*.wsdl</include> </schemaIncludes> </configuration> </execution> </executions> <!-- 给插件添加运行时必需的JAXB依赖 --> <dependencies> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>3.0.2</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>3.0.2</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-xjc</artifactId> <version>3.0.2</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>3.0.2</version> </dependency> </dependencies> </plugin>
2. 升级maven-compiler-plugin至Java 17兼容版本
原3.8.1版本对Java 17支持不完善,替换为最新稳定版:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>17</source> <target>17</target> <!-- 启用模块化支持,规避Java9+的反射限制 --> <compilerArgs> <arg>--add-modules</arg> <arg>java.xml.bind</arg> </compilerArgs> </configuration> </plugin>
3. 替换项目依赖为JAXB3.x版本(Jakarta命名空间)
Java 17建议使用Jakarta EE规范的JAXB版本,替代旧版javax命名空间的依赖:
<dependencies> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>3.0.2</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>3.0.2</version> <scope>runtime</scope> </dependency> </dependencies>
4. 清理Maven缓存并重新构建
执行以下命令清理本地仓库缓存,避免旧依赖干扰:
mvn clean install -U
关键提醒
Maven插件的运行时依赖与项目依赖相互隔离,必须在插件内部的<dependencies>标签中声明JAXB相关依赖,才能解决插件执行阶段的类缺失问题;JAXB3.x使用jakarta.xml.bind命名空间,替代了旧版的javax.xml.bind,更适配Java9+的模块化系统。
内容的提问来源于stack exchange,提问作者Varsha Bairwa
相关产品推荐
相关产品推荐

