Java19下用Maven CXF插件生成WSDL代码遇HexBinaryAdapter缺失错误
问题详情
在Java 19环境中使用Apache CXF的cxf-codegen-plugin(3.5.4版本)生成WSDL代码时,触发类缺失错误:
[ERROR] Failed to execute goal org.apache.cxf:cxf-codegen-plugin:3.5.4:wsdl2java (default) on project customsx: Execution default of goal org.apache.cxf:cxf-codegen-plugin:3.5.4:wsdl2java failed: A required class was missing while executing org.apache.cxf:cxf-codegen-plugin:3.5.4:wsdl2java: javax/xml/bind/annotation/adapters/HexBinaryAdapter
当前插件配置如下:
<plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <version>3.5.4</version> <executions> <execution> <phase>generate-sources</phase> <configuration> <sourceRoot>${project.build.directory}/generated/cxf</sourceRoot> <wsdlOptions> <wsdlOption> <wsdl>${basedir}/src/main/wsdl/sample.wsdl</wsdl> </wsdlOption> </wsdlOptions> </configuration> <goals> <goal>wsdl2java</goal> </goals> </execution> </executions> <dependencies> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>4.0.1</version> </dependency> <!--dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>4.0.1</version> </dependency--> </dependencies> </plugin>
未添加Jakarta依赖时会报javax.xml.bind.annotation缺失,添加后又出现HexBinaryAdapter缺失,需在保留Java 19的前提下解决该问题。
可行解决方案
方案1:升级CXF插件到支持Jakarta EE 9+的版本
CXF 3.5.x默认依赖JAXB的javax包,而Java 19已完全移除这些API,Jakarta EE 9+已将包名迁移至jakarta.xml.bind。升级到CXF 4.x版本(原生支持Jakarta EE 9+)可彻底解决问题:
修改插件配置如下:
<plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <!-- 使用CXF 4.x版本,示例为4.0.0 --> <version>4.0.0</version> <executions> <execution> <phase>generate-sources</phase> <configuration> <sourceRoot>${project.build.directory}/generated/cxf</sourceRoot> <wsdlOptions> <wsdlOption> <wsdl>${basedir}/src/main/wsdl/sample.wsdl</wsdl> </wsdlOption> </wsdlOptions> </configuration> <goals> <goal>wsdl2java</goal> </goals> </execution> </executions> <dependencies> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>4.0.1</version> </dependency> </dependencies> </plugin>
方案2:为CXF 3.5.x添加JAXB javax兼容核心包
若无法升级CXF版本,可添加包含HexBinaryAdapter类的jaxb-core包,补充插件运行时缺失的javax类:
修改插件依赖部分:
<dependencies> <!-- 添加JAXB javax核心包,提供HexBinaryAdapter --> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.0.1</version> </dependency> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>4.0.1</version> </dependency> </dependencies>
方案3:添加--jakarta参数生成Jakarta命名空间代码(CXF 3.5.3+支持)
CXF 3.5.3及以上版本支持--jakarta参数,可直接生成使用jakarta.xml.bind命名空间的代码,避免依赖javax包:
在插件配置中添加参数:
<configuration> <sourceRoot>${project.build.directory}/generated/cxf</sourceRoot> <wsdlOptions> <wsdlOption> <wsdl>${basedir}/src/main/wsdl/sample.wsdl</wsdl> <!-- 添加Jakarta参数 --> <additionalArgs> <additionalArg>--jakarta</additionalArg> </additionalArgs> </wsdlOption> </wsdlOptions> </configuration>
保持现有Jakarta依赖不变即可正常生成代码。
内容的提问来源于stack exchange,提问作者user2123288

