Java 17下maven-jaxb2-plugin从XSD生成XML无输出问题求助
Java 17迁移后maven-jaxb2-plugin不生成代码的解决方案
1. 升级插件至Jakarta兼容版本
旧版本的maven-jaxb2-plugin(0.13.2/0.15.2)基于传统JAXB(javax.xml.bind),无法适配Java 17的Jakarta EE生态。需升级到支持Jakarta XML Binding 3.0+的4.x版本,示例配置如下:
<plugin> <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>maven-jaxb2-plugin</artifactId> <version>4.0.1</version> <!-- 适配Java 11+与Jakarta JAXB 3.0 --> <executions> <execution> <id>add-source</id> <goals> <goal>generate</goal> </goals> <configuration> <schemaDirectory>src/main/resources/META-INF/xsd</schemaDirectory> <schemaIncludes> <include>fe2_flux_generique.xsd</include> </schemaIncludes> <bindingDirectory>src/main/resources/META-INF/xsd</bindingDirectory> <bindingIncludes> <include>fe2_flux_generique.xjb</include> </bindingIncludes> <generateDirectory>${project.basedir}/src/generated</generateDirectory> <generatePackage>fr.icdc.dei.ddr.fe2.xml.domain</generatePackage> <jaxbVersion>3.0</jaxbVersion> <!-- 明确指定Jakarta JAXB版本 --> </configuration> </execution> </executions> <!-- 插件内部依赖Jakarta版本的XJC工具 --> <dependencies> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-xjc</artifactId> <version>3.0.1</version> </dependency> </dependencies> </plugin>
2. 修正XJB绑定文件
仅修改命名空间和版本不够,需将javax.xml.bind.DatatypeConverter替换为Jakarta版本(Java 17已移除javax.xml.bind包),修改后的绑定文件:
<?xml version="1.0" encoding="UTF-8"?> <jxb:bindings version="3.0" xmlns:jxb="https://jakarta.ee/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <jxb:globalBindings> <jxb:serializable uid="1" /> <!-- 替换为Jakarta版本的DatatypeConverter --> <jxb:javaType name="java.util.Calendar" xmlType="xsd:dateTime" parseMethod="jakarta.xml.bind.DatatypeConverter.parseDateTime" printMethod="jakarta.xml.bind.DatatypeConverter.printDateTime" /> </jxb:globalBindings> </jxb:bindings>
3. 添加项目级Jakarta JAXB依赖
Java 17不再内置JAXB相关类,需在pom.xml中添加API和运行时依赖:
<dependencies> <!-- Jakarta JAXB API --> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>3.0.1</version> </dependency> <!-- JAXB运行时实现 --> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>3.0.1</version> <scope>runtime</scope> </dependency> </dependencies>
4. 验证构建命令
执行完整的生成命令,确保触发代码生成阶段:
mvn clean generate-sources
若仍无文件生成,可添加-X参数查看详细日志,排查schema解析或绑定配置的潜在错误:
mvn clean generate-sources -X
5. 可选:调整生成目录
原配置的src/generated可能存在权限或maven规范问题,建议改用maven标准生成目录:
<generateDirectory>${project.build.directory}/generated-sources/xjc</generateDirectory>
该目录默认会被maven识别为源码目录,无需额外配置。
内容的提问来源于stack exchange,提问作者martin
相关产品推荐
相关产品推荐

