使用jaxb2-rich-contract-plugin生成两个Builder时遇重复类异常
解决JAXB2 Rich Contract Plugin生成重复工具类的问题
我之前也碰到过一模一样的问题,你遇到的duplicate class: com.kscs.util.jaxb.Copyable和Buildable错误,本质是因为每个Maven execution执行时,插件都会默认生成一套通用工具类,而这些类的包名和类名完全一致,当两次生成的目录都被加入编译路径时,就会触发重复类冲突。
核心解决方案:只生成一次工具类
我们只需要在其中一个execution中保留工具类生成(-generateTools=y),另一个execution禁用工具类生成(-generateTools=n),同时确保两个execution生成的业务类包名不重叠,就可以解决冲突。
另外你在版本2中尝试修改Builder相关命名的参数其实没用,因为冲突的是通用工具类,不是业务类的Builder类。
修改后的配置示例(基于版本1调整)
<plugin> <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>maven-jaxb2-plugin</artifactId> <version>0.14.0</version> <extensions>true</extensions> <configuration> <extension>true</extension> <plugins> <plugin> <groupId>net.codesup.util</groupId> <artifactId>jaxb2-rich-contract-plugin</artifactId> <version>2.0.1</version> </plugin> </plugins> </configuration> <executions> <!-- 第一个execution:生成order相关类,同时生成工具类 --> <execution> <id>generate-order</id> <phase>generate-sources</phase> <goals> <goal>generate</goal> </goals> <configuration> <args> <arg>-Ximmutable</arg> <arg>-Xcopy</arg> <arg>-partial=n</arg> <arg>-generateTools=y</arg> <!-- 保留工具类生成 --> <arg>-constructor=n</arg> <arg>-narrow=y</arg> <arg>-Xfluent-builder</arg> <arg>-copyPartial=n</arg> <arg>-narrow=y</arg> </args> <schemaIncludes> <include>xsd/order.xsd</include> </schemaIncludes> <bindingIncludes> <include>xsd/bindings.xjc</include> </bindingIncludes> <generatePackage>com.company.order.model.xsd</generatePackage> <generateDirectory>${project.build.directory}/generated-sources/xsd</generateDirectory> </configuration> </execution> <!-- 第二个execution:生成extended order相关类,禁用工具类生成 --> <execution> <id>generate-extended-order</id> <phase>generate-sources</phase> <goals> <goal>generate</goal> </goals> <configuration> <args> <arg>-Ximmutable</arg> <arg>-Xcopy</arg> <arg>-partial=n</arg> <arg>-generateTools=n</arg> <!-- 关键:禁用工具类生成 --> <arg>-constructor=n</arg> <arg>-narrow=y</arg> <arg>-Xfluent-builder</arg> <arg>-copyPartial=n</arg> <arg>-narrow=y</arg> </args> <schemaIncludes> <include>xsd/extended.xsd</include> </schemaIncludes> <bindingIncludes> <include>xsd/bindings.xjc</include> </bindingIncludes> <generatePackage>com.company.order.model.extended.xsd</generatePackage> <generateDirectory>${project.build.directory}/generated-sources/extended-xsd</generateDirectory> </configuration> </execution> </executions> </plugin>
额外说明
- 如果你的两个XSD生成的业务类需要不同的插件参数(比如extended不需要
-Xcopy),可以像版本2那样分开配置args,但核心还是要确保只有一个execution生成工具类。 - 工具类(Copyable、Buildable等)是通用的,只需要生成一次,所有业务类都会依赖这些类,所以禁用第二次生成不会影响功能。
内容的提问来源于stack exchange,提问作者Niklas Pragsten
相关产品推荐
相关产品推荐

