升级Java17+Spring6.1.8后使用CXF WSDLToJava遇jaxws前端类路径错误
解决CXF WSDLToJava找不到jaxws frontend的问题
针对你升级到Java17+Spring6.1.8后遇到的错误,可按以下步骤排查解决:
1. 统一CXF版本,避免依赖冲突
确保所有CXF相关依赖(包括插件和runtime依赖)使用完全相同的版本,比如你用的4.0.2。混合不同版本的CXF jar包会导致类路径冲突,是这类错误的常见原因。
2. 正确配置cxf-codegen-plugin(推荐方案)
相比exec-maven-plugin,cxf-codegen-plugin是官方推荐的代码生成工具,配置更简洁且不易出错。以下是完整的兼容Java17的配置示例:
<plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <version>4.0.2</version> <executions> <execution> <id>generate-cxf-sources</id> <phase>generate-sources</phase> <goals> <goal>wsdl2java</goal> </goals> <configuration> <wsdlOptions> <wsdlOption> <!-- 替换为你的WSDL文件路径 --> <wsdl>${project.basedir}/src/main/resources/your-service.wsdl</wsdl> <frontend>jaxws</frontend> <!-- 输出目录可自定义 --> <outputDir>${project.build.directory}/generated-sources/cxf</outputDir> </wsdlOption> </wsdlOptions> </configuration> <dependencies> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>4.0.2</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-databinding-jaxb</artifactId> <version>4.0.2</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>4.0.2</version> </dependency> </dependencies> </execution> </executions> </plugin>
3. 若坚持使用exec-maven-plugin,需补充完整依赖
exec-maven-plugin需要显式引入所有CXF工具类依赖,尤其是cxf-tools-wsdlto-jaxws,示例配置:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <id>generate-wsdl-client</id> <phase>generate-sources</phase> <goals> <goal>java</goal> </goals> <configuration> <mainClass>org.apache.cxf.tools.wsdlto.WSDLToJava</mainClass> <arguments> <argument>-frontend</argument> <argument>jaxws</argument> <argument>-wsdl</argument> <argument>${project.basedir}/src/main/resources/your-service.wsdl</argument> <argument>-d</argument> <argument>${project.build.directory}/generated-sources/cxf</argument> </arguments> </configuration> <dependencies> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-tools-wsdlto-jaxws</artifactId> <version>4.0.2</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>4.0.2</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-databinding-jaxb</artifactId> <version>4.0.2</version> </dependency> </dependencies> </execution> </executions> </plugin>
4. 补充Java17缺失的JAXB依赖
Java17移除了JAXB的内置支持,需手动添加以下依赖到pom.xml:
<dependencies> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>4.0.5</version> <scope>runtime</scope> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>4.0.5</version> </dependency> </dependencies>
5. 排查依赖冲突
执行mvn dependency:tree命令,检查是否有旧版本的CXF、JAX-WS或JAXB依赖被引入。若发现冲突,使用<exclusions>标签排除旧版本依赖。
内容的提问来源于stack exchange,提问作者idoor
相关产品推荐
相关产品推荐

