Java 11环境下从orm.xml生成Hibernate静态元模型失败求助
解决Java 11下Hibernate静态元模型生成的JAXB相关问题
问题核心
Java 11移除了JDK自带的JAXB模块,导致Hibernate JPAModelGen解析orm.xml时找不到JAXB实现;后续引入JAXB后出现的ClassCastException,是因为JAXB类被不同类加载器重复加载,导致类型不匹配。
解决方案
1. 正确配置注解处理器依赖
将JAXB相关依赖仅添加到Maven编译插件的annotationProcessorPaths中,确保注解处理器使用独立的类加载器加载这些依赖,避免与项目主类路径冲突:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>11</source> <target>11</target> <annotationProcessorPaths> <!-- Hibernate静态元模型生成器 --> <path> <groupId>org.hibernate</groupId> <artifactId>hibernate-jpamodelgen</artifactId> <version>适配你的Hibernate版本</version> </path> <!-- JAXB API --> <path> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </path> <!-- JAXB 核心实现 --> <path> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.0.1</version> </path> <!-- JAXB运行时 --> <path> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>2.3.1</version> </path> <!-- JAXB激活依赖 --> <path> <groupId>javax.activation</groupId> <artifactId>javax.activation-api</artifactId> <version>1.2.0</version> </path> </annotationProcessorPaths> </configuration> </plugin> </plugins> </build>
2. 清理冲突依赖
- 移除项目主
<dependencies>块中所有JAXB相关依赖,防止主类加载器和注解处理器类加载器重复加载同一类 - 执行
mvn dependency:tree检查依赖树,排除任何意外引入的JAXB重复依赖
3. 验证构建
- 执行
mvn clean清空旧构建产物 - 运行
mvn compile,检查target/generated-sources/annotations目录是否生成了预期的静态元模型类
4. 模块化项目额外配置
如果项目使用Java模块(存在module-info.java),需在模块声明中添加:
module 你的模块名 { requires javax.xml.bind; requires org.glassfish.jaxb.runtime; // 其他必要模块声明 }
内容的提问来源于stack exchange,提问作者Emeric Pinon
相关产品推荐
相关产品推荐

