You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级至Java17+SpringBoot3后,jaxb2-maven-plugin无法正确生成ObjectFactory

JAXB2 Maven插件3.1.0在Java17+SpringBoot3环境下ObjectFactory仅生成.java文件导致IDE无法解析问题

问题背景

使用jaxb2-maven-plugin 3.1.0从XSD生成Java类,升级到Java17和SpringBoot3环境后,其他类均正常生成.class文件,唯独ObjectFactory仅生成未编译的.java文件。IDE无法解析该类(无论是当前项目直接使用,还是依赖该项目的其他项目导入),但项目实际编译、测试均能正常运行。

插件配置

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-compiler-plugin</artifactId>
   <version>3.11.0</version>
   <configuration>
      <release>${java.version}</release>
   </configuration>
</plugin>
<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-surefire-plugin</artifactId>
   <version>2.22.2</version>
</plugin>
<plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>jaxb2-maven-plugin</artifactId>
   <version>3.1.0</version>
   <executions>
      <execution>
         <id>xjc</id>
         <goals>
            <goal>xjc</goal>
         </goals>
      </execution>
   </executions>
   <configuration>
      <xjbSources>
         <xjbSource>${basedir}/src/main/resources/xjb/bindings.xjb</xjbSource>
      </xjbSources>
      <sources>
         <source>${basedir}/src/main/resources/xsd/my-xsd.xsd</source>
      </sources>
      <outputDirectory>${project.build.directory}/generated-sources/xjc</outputDirectory>
      <packageName>com....</packageName>
   </configuration>
</plugin>
<plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>build-helper-maven-plugin</artifactId>
   <version>3.3.0</version>
   <executions>
      <execution>
         <id>add-source</id>
         <phase>generate-sources</phase>
         <goals>
            <goal>add-source</goal>
         </goals>
         <configuration>
            <sources>
               <source>${project.build.directory}/generated-sources/xjc</source>
            </sources>
         </configuration>
      </execution>
   </executions>
</plugin>

现象细节

  • IDE中ObjectFactory类标红,无法自动导入或识别
  • 生成目录/generated-sources/xjc下仅存在ObjectFactory.java,其他类已编译为.class文件
  • target/classes目录中存在ObjectFactory.class,与其他类结构一致
  • 依赖该项目的其他项目也出现相同IDE解析问题,但编译运行不受影响

问题排查与解决方案

1. 修复Jakarta命名空间绑定配置

JAXB3.x已完全迁移到Jakarta命名空间,原javax.xml.bind包替换为jakarta.xml.bind,绑定文件可能存在命名空间不兼容问题。

修改bindings.xjb的命名空间声明:

<jaxb:bindings xmlns:jaxb="https://jakarta.ee/xml/ns/jaxb"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               jaxb:version="3.0">
    <!-- 原有绑定配置 -->
</jaxb:bindings>

2. 调整插件执行顺序与编译触发

显式指定jaxb插件的执行阶段,确保生成代码在编译前完成,同时强制IDE识别生成的源码目录:

<plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>jaxb2-maven-plugin</artifactId>
   <version>3.1.0</version>
   <executions>
      <execution>
         <id>xjc</id>
         <phase>generate-sources</phase> <!-- 显式绑定到generate-sources阶段 -->
         <goals>
            <goal>xjc</goal>
         </goals>
      </execution>
   </executions>
   <!-- 其余配置不变 -->
</plugin>

执行命令强制重新生成并编译:

mvn clean generate-sources compile

之后刷新IDE缓存(IntelliJ:File -> Invalidate Caches / Restart;Eclipse:Project -> Clean)。

3. 更换为Jakarta官方JAXB插件

org.codehaus.mojo的jaxb2-maven-plugin在Jakarta环境下可能存在兼容性缺陷,建议替换为Eclipse官方的Jakarta JAXB插件:

<plugin>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>org.eclipse.persistence.jaxb.maven.plugin</artifactId>
    <version>4.0.2</version>
    <executions>
        <execution>
            <id>xjc</id>
            <goals>
                <goal>xjc</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <schemaDirectory>${basedir}/src/main/resources/xsd</schemaDirectory>
        <schemaFiles>my-xsd.xsd</schemaFiles>
        <bindingDirectory>${basedir}/src/main/resources/xjb</bindingDirectory>
        <bindingFiles>bindings.xjb</bindingFiles>
        <outputDirectory>${project.build.directory}/generated-sources/xjc</outputDirectory>
        <packageName>com....</packageName>
        <xmlVersion>3.0</xmlVersion>
    </configuration>
</plugin>

同时引入Jakarta JAXB依赖:

<dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
    <version>3.0.2</version>
</dependency>
<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>org.eclipse.persistence.moxy</artifactId>
    <version>4.0.2</version>
</dependency>

4. 强制更新IDE依赖索引

若以上操作无效,可尝试:

  • 删除本地Maven仓库中该项目的依赖缓存,重新执行mvn clean install
  • 在IDE中重新导入Maven项目(IntelliJ:File -> New -> Project from Existing Sources;Eclipse:File -> Import -> Maven -> Existing Maven Projects)

内容的提问来源于stack exchange,提问作者lcgsrick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 19:14:56