如何修改maven-jaxb2-plugin生成的JAXB类类名与包结构?
解决maven-jaxb2-plugin生成JAXB类包结构不符合预期的问题
我来帮你搞定这个包结构不对的问题!通常出现生成多个包的情况,都是因为WSDL里的命名空间没有被统一映射到目标包,或者插件配置、bindings.xjb的规则没写到位。下面是具体的解决方案:
1. 检查并修正maven-jaxb2-plugin的POM配置
首先确保插件的核心参数配置正确,特别是包路径和绑定文件的引用。这里给你一个标准的配置示例,你可以对照调整:
<plugin> <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>maven-jaxb2-plugin</artifactId> <version>0.15.2</version> <!-- 建议使用稳定的新版本 --> <executions> <execution> <goals> <goal>generate</goal> </goals> </execution> </executions> <configuration> <!-- 指定你的WSDL文件所在目录 --> <schemaDirectory>${project.basedir}/src/main/resources/wsdl</schemaDirectory> <schemaIncludes> <include>你的WSDL文件名.wsdl</include> <!-- 替换成实际文件名 --> </schemaIncludes> <!-- 全局默认包(如果bindings里有命名空间映射,会优先使用bindings的配置) --> <generatePackage>com.wsdl</generatePackage> <!-- 指定bindings.xjb所在目录 --> <bindingDirectory>${project.basedir}/src/main/resources</bindingDirectory> <bindingIncludes> <include>bindings.xjb</include> </bindingIncludes> </configuration> </plugin>
关键注意点:generatePackage是全局兜底的包名,但如果WSDL里包含多个命名空间,必须在bindings里逐个映射,否则每个命名空间会生成独立的包。
2. 修正bindings.xjb,统一映射所有命名空间到com.wsdl
这是解决多包问题的核心!你需要把WSDL里所有涉及到的命名空间,都绑定到com.wsdl包。下面是一个正确的bindings.xjb示例,你可以根据自己的WSDL结构调整:
<jaxb:bindings version="2.1" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> <!-- 绑定你的WSDL文件 --> <jaxb:bindings schemaLocation="wsdl/你的WSDL文件名.wsdl" node="/wsdl:definitions"> <!-- 绑定WSDL中types节点下的主XMLSchema --> <jaxb:bindings node="wsdl:types/xsd:schema"> <!-- 替换成你WSDL的targetNamespace值 --> <jaxb:schemaBindings> <jaxb:package name="com.wsdl"/> </jaxb:schemaBindings> </jaxb:bindings> <!-- 如果你的WSDL里import了其他xsd文件/命名空间,也要添加对应的绑定 --> <jaxb:bindings node="wsdl:types/xsd:schema/xsd:import[@namespace='http://xxx/your-other-namespace']"> <jaxb:schemaBindings> <jaxb:package name="com.wsdl"/> </jaxb:schemaBindings> </jaxb:bindings> </jaxb:bindings> </jaxb:bindings>
关键说明:
- 找到你WSDL里的所有命名空间:包括
<wsdl:definitions>的targetNamespace属性、<xsd:schema>的targetNamespace,以及所有<xsd:import>的namespace属性。 - 每个命名空间都需要在bindings.xjb里配置对应的
<jaxb:package>,确保它们都指向com.wsdl。
3. 清理缓存并重新构建
执行以下命令,彻底清理之前生成的类,然后重新生成:
mvn clean generate-sources
这样可以避免旧的生成文件干扰新的结果。
常见坑点提醒
- 不要让POM里的
generatePackage和bindings.xjb里的package出现冲突,保持目标包名一致。 - 确保bindings.xjb里的
schemaLocation路径正确:如果你的WSDL在src/main/resources/wsdl下,路径要写成wsdl/xxx.wsdl(相对于bindingDirectory的位置)。 - 如果WSDL里有多个独立的
<xsd:schema>节点,每个都需要单独绑定到目标包。
内容的提问来源于stack exchange,提问作者Khuzi
相关产品推荐
相关产品推荐

