使用Jakarta+Maven生成WSDL Stub遇阻,求排查及Apache Axis方案
问题背景
使用Java 20,计划基于WSDL文件生成Jakarta规范的Java WebService客户端代码。已引入jakarta.xml.ws-api依赖,并配置jaxws-maven-plugin执行wsimport目标,但执行mvn clean install后未生成预期的Java文件,同时对<sourceDestDir>和<packageName>的配置存在疑问。
一、当前配置的问题排查
1. 路径配置错误
你的<wsdlDirectory>和<sourceDestDir>使用了非标准相对路径,Maven无法正确识别(正确路径需基于项目根目录)。建议改用Maven内置变量${project.basedir}指定路径:
<wsdlDirectory>${project.basedir}/src/main/resources/</wsdlDirectory> <sourceDestDir>${project.basedir}/target/generated-sources/jaxws</sourceDestDir>
推荐将生成代码输出到
target/generated-sources目录,避免把自动生成的代码提交到版本控制系统。
2. 缺少JAX-WS实现依赖
jakarta.xml.ws-api仅为API规范,无具体实现。jaxws-maven-plugin需要依赖JAX-WS运行时库才能正常工作,需在插件中添加依赖:
<plugin> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-maven-plugin</artifactId> <version>4.0.1</version> <dependencies> <dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-rt</artifactId> <version>4.0.1</version> <scope>runtime</scope> </dependency> </dependencies> <!-- 其他配置 --> </plugin>
3. 执行命令排查日志
单独执行mvn jaxws:wsimport,查看控制台日志,是否有找不到WSDL文件、权限不足或语法错误等提示,这些信息可直接定位问题。
4. <packageName>与<sourceDestDir>说明
<packageName>:指定生成Java类的包名,例如你配置的com.omo.robi.ThirdpartyRequest.webservice,生成的类会放在该包路径下。<sourceDestDir>:指定生成Java文件的根目录,结合<packageName>,最终文件路径为${sourceDestDir}/com/omo/robi/ThirdpartyRequest/webservice/。
二、修正后的完整插件配置
<plugin> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-maven-plugin</artifactId> <version>4.0.1</version> <dependencies> <dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-rt</artifactId> <version>4.0.1</version> <scope>runtime</scope> </dependency> </dependencies> <executions> <execution> <goals> <goal>wsimport</goal> </goals> </execution> </executions> <configuration> <wsdlDirectory>${project.basedir}/src/main/resources/</wsdlDirectory> <wsdlFiles> <wsdlFile>hexingws.wsdl</wsdlFile> </wsdlFiles> <packageName>com.omo.robi.ThirdpartyRequest.webservice</packageName> <sourceDestDir>${project.basedir}/target/generated-sources/jaxws</sourceDestDir> <!-- 自动将生成目录加入编译路径 --> <sourceRoot>${project.basedir}/target/generated-sources/jaxws</sourceRoot> </configuration> </plugin>
添加<sourceRoot>可让Maven自动把生成的代码目录加入编译路径,无需手动配置。
三、其他实现方法:Apache CXF插件
Apache CXF是主流WebService框架,支持Jakarta规范,配置步骤如下:
- 添加CXF依赖
<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-transports-http</artifactId> <version>4.0.2</version> </dependency>
- 配置
cxf-codegen-plugin
<plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <version>4.0.2</version> <executions> <execution> <id>generate-sources</id> <phase>generate-sources</phase> <goals> <goal>wsdl2java</goal> </goals> <configuration> <wsdlOptions> <wsdlOption> <wsdl>${project.basedir}/src/main/resources/hexingws.wsdl</wsdl> <extraargs> <extraarg>-p</extraarg> <extraarg>com.omo.robi.ThirdpartyRequest.webservice</extraarg> </extraargs> </wsdlOption> </wsdlOptions> <sourceRoot>${project.basedir}/target/generated-sources/cxf</sourceRoot> </configuration> </execution> </executions> </plugin>
- 执行
mvn clean install,生成的代码会在target/generated-sources/cxf目录下。
四、使用Apache Axis2生成代码(支持Jakarta)
Apache Axis2也可生成符合Jakarta规范的WebService代码,步骤如下:
1. 添加Axis2依赖
<dependency> <groupId>org.apache.axis2</groupId> <artifactId>axis2-jaxws</artifactId> <version>1.8.2</version> </dependency>
2. 配置axis2-wsdl2code-maven-plugin
<plugin> <groupId>org.apache.axis2</groupId> <artifactId>axis2-wsdl2code-maven-plugin</artifactId> <version>1.8.2</version> <executions> <execution> <goals> <goal>wsdl2code</goal> </goals> <configuration> <wsdlFile>${project.basedir}/src/main/resources/hexingws.wsdl</wsdlFile> <packageName>com.omo.robi.ThirdpartyRequest.webservice</packageName> <outputDirectory>${project.basedir}/target/generated-sources/axis2</outputDirectory> <databindingName>jaxb</databindingName> <language>java</language> </configuration> </execution> </executions> </plugin>
3. 执行生成命令
运行mvn axis2:wsdl2code,生成的代码会输出到指定的outputDirectory中。
内容的提问来源于stack exchange,提问作者Hashini Udara

