使用Maven从WSDL生成Java Stub失败,请求解决方案
解决JAXB生成Stub时的反射警告与ObjectFactory冲突问题
我来帮你一步步搞定遇到的这两个问题:
一、处理jaxb-runtime非法反射访问警告
这个警告是因为JAXB 2.3.0版本在Java 9及以上的模块系统环境下,存在非法反射访问JDK内部API的情况,而且maven-jaxb2-plugin默认依赖了这个版本——你删本地仓库后它又自动生成,就是因为插件的依赖链里指定了这个版本。解决办法很简单,主动覆盖依赖版本即可:
- 在你的pom.xml里,给maven-jaxb2-plugin添加jaxb-runtime的依赖,指定兼容的新版本(比如2.3.1或更高,推荐2.4.0+):
<plugin> <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>maven-jaxb2-plugin</artifactId> <version>0.14.0</version> <executions> <execution> <goals> <goal>generate</goal> </goals> </execution> </executions> <dependencies> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-runtime</artifactId> <version>2.4.0</version> </dependency> </dependencies> </plugin>
- 如果你用的是Java 11+,还可以添加JVM参数快速抑制警告(但优先推荐版本升级,这是更根本的解决方式):
-Djdk.module.illegalAccess=warn
二、解决ObjectFactory类冲突问题
这个问题是因为AFSService_1.xsd第328和377行的声明,生成了同名的ObjectFactory类(或者和其他XSD生成的类重名)。解决核心是通过JAXB绑定文件给不同的XSD指定专属包名,或者重命名冲突类,具体步骤如下:
1. 编写JAXB绑定文件(比如src/main/resources/jaxb-bindings.xjb)
示例内容如下,针对冲突的XSD设置单独的包名,也可以针对性重命名特定冲突类:
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" jaxb:version="2.1"> <!-- 给AFSService_1.xsd指定专属包名,避免ObjectFactory冲突 --> <jaxb:bindings schemaLocation="arvatoprod/AFSService_1.xsd"> <jaxb:schemaBindings> <jaxb:package name="com.yourcompany.arvatoprod.afsservice"/> </jaxb:schemaBindings> <!-- 如果是某个特定类型冲突,还可以单独重命名 --> <jaxb:bindings node="//xsd:complexType[@name='ConflictType']"> <jaxb:class name="AFSConflictType"/> </jaxb:bindings> </jaxb:bindings> <!-- 其他XSD如果也有冲突,同理添加对应的绑定配置 --> </jaxb:bindings>
2. 在maven-jaxb2-plugin中配置绑定文件
修改pom.xml里的插件配置,引入刚才写的绑定文件:
<plugin> <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>maven-jaxb2-plugin</artifactId> <version>0.14.0</version> <executions> <execution> <goals> <goal>generate</goal> </goals> <configuration> <!-- 指定绑定文件所在目录 --> <bindingDirectory>src/main/resources</bindingDirectory> <bindingIncludes> <include>jaxb-bindings.xjb</include> </bindingIncludes> <!-- 指定XSD文件所在目录 --> <schemaDirectory>src/main/resources/arvatoprod</schemaDirectory> <schemaIncludes> <include>*.xsd</include> </schemaIncludes> </configuration> </execution> </executions> <!-- 加上之前的jaxb-runtime依赖配置 --> </plugin>
3. 验证执行
重新运行mvn generate-sources,此时每个XSD会生成到指定的专属包下,ObjectFactory类就不会再冲突了。如果还有问题,可以仔细检查AFSService_1.xsd那两行的声明,看看是不是重复定义了相同类型或命名空间,再针对性调整绑定文件即可。
内容的提问来源于stack exchange,提问作者Wrapper
相关产品推荐
相关产品推荐

