使用JAXB 3.0和jaxb2-maven-plugin时-Xannotate参数失效
迁移JAXB从javax.*到jakarta.*时-Xannotate参数不识别问题解决
问题概述
正在把Java类生成逻辑从javax.迁移到jakarta.,当前使用的Maven JAXB插件配置如下:
<groupId>org.codehaus.mojo</groupId> <artifactId>jaxb2-maven-plugin</artifactId> <version>3.1.0</version>
已将目标版本设为3.0,并添加了两个参数:
<arguments> <argument>-Xinject-code</argument> <argument>-Xannotate</argument> </arguments>
xjb绑定文件里配置了annotate来给生成类加Lombok注解:
<jxb:bindings version="3.0" xmlns:jxb="https://jakarta.ee/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:annox="http://annox.dev.java.net" jxb:extensionBindingPrefixes="xjc annox">
但运行时直接报错:com.sun.tools.xjc.BadCommandLineException: unrecognized parameter -Xannotate
已试无效的操作
曾尝试添加以下插件依赖,但问题依旧:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxb2-maven-plugin</artifactId> <version>3.1.0</version> ... <dependencies> <dependency> <groupId>org.patrodyne.jvnet</groupId> <artifactId>hisrc-hyperjaxb-annox-plugin</artifactId> <version>2.1.1</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </dependency> </dependencies> </plugin>
可行解决方案
问题出在你用的annox插件版本不兼容Jakarta JAXB 3.0,换成适配版本即可,步骤如下:
1. 替换插件依赖
使用适配Jakarta的jaxb2-basics-annotate插件,同时引入配套的jaxb2-basics工具包,更新后的插件配置:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxb2-maven-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <goals> <goal>xjc</goal> </goals> </execution> </executions> <configuration> <target>3.0</target> <arguments> <argument>-Xinject-code</argument> <argument>-Xannotate</argument> </arguments> <!-- 根据你的实际路径调整bindingDirectory --> <bindingDirectory>src/main/resources/bindings</bindingDirectory> </configuration> <dependencies> <!-- 适配Jakarta的jaxb2基础工具和annotate插件 --> <dependency> <groupId>org.jvnet.jaxb2_commons</groupId> <artifactId>jaxb2-basics</artifactId> <version>1.11.1</version> </dependency> <dependency> <groupId>org.jvnet.jaxb2_commons</groupId> <artifactId>jaxb2-basics-annotate</artifactId> <version>1.11.1</version> </dependency> <!-- Lombok依赖,版本根据你的Java版本调整 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </dependency> </dependencies> </plugin>
2. 更新xjb绑定文件的命名空间
把annox和xjc的命名空间换成Jakarta适配的版本,确保配置正确:
<jxb:bindings version="3.0" xmlns:jxb="https://jakarta.ee/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xjc="https://jakarta.ee/xml/ns/jaxb/xjc" xmlns:annox="https://github.com/highsource/jaxb2-annotate-plugin" jxb:extensionBindingPrefixes="xjc annox"> <!-- 示例:给所有生成类添加Lombok的@Data注解 --> <jxb:bindings schemaLocation="your-schema-file.xsd" node="/xs:schema"> <annox:annotate target="class"> <annox:annotation>org.projectlombok.Data</annox:annotation> </annox:annotate> </jxb:bindings> </jxb:bindings>
3. 关键注意点
- 你之前用的
hisrc-hyperjaxb-annox-plugin2.1.1是基于javax.*的,完全不兼容Jakarta JAXB 3.0,必须替换。 - 确保插件的
target参数保持为3.0,和JAXB版本对齐。 - Lombok版本要和你的Java版本匹配,比如Java 17建议用1.18.24及以上版本。
内容的提问来源于stack exchange,提问作者Ismael
相关产品推荐
相关产品推荐

