编译为Java 8的JAXB依赖应用能否直接在OpenJDK 11运行?
问题解答
可以不用全面迁移至Java 11编译,通过补充缺失的依赖即可让Java 8编译的应用在OpenJDK 11上正常运行,无需切换到Jakarta EE。
问题根源
Java 8中JAXB(javax.xml.bind相关类)是JDK内置组件,但从Java 9开始,JDK采用模块化架构将JAXB移至可选模块,到Java 11时直接移除了该模块。你遇到的NoSuchMethodError正是因为运行时找不到原本JDK自带的JAXB相关方法。
解决步骤
只需在项目中添加JAXB 2.3的官方依赖(保持javax包路径,无需替换为Jakarta),让应用运行时从外部依赖加载JAXB组件:
- 核心API依赖:
javax.xml.bind:jaxb-api:2.3.1 - JAXB运行时实现:
com.sun.xml.bind:jaxb-impl:2.3.3 - JAXB核心工具类:
com.sun.xml.bind:jaxb-core:2.3.0.1 - 激活框架依赖(Java 9+同样移除了该组件):
javax.activation:activation:1.1.1
以Maven为例,在pom.xml中添加:
<dependencies> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.3</version> <scope>runtime</scope> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.0.1</version> </dependency> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency> </dependencies>
添加这些依赖后,Java 8编译的字节码可直接在OpenJDK 11上运行,完全依赖JDK的向后兼容性,无需修改现有代码或升级编译版本。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

