Java 9环境下无需额外模块配置,正确使用Spring JAXB Marshaller的方法
在Java 9环境下无需额外定义模块,如何正确使用Spring的Jaxb2Marshaller?
先看你提供的示例代码:
@SpringBootApplication public class App implements CommandLineRunner { public static void main(String[] args) { SpringApplication.run(App.class, args); } @Bean public Jaxb2Marshaller jaxb2Marshaller() { Jaxb2Marshaller bean = new Jaxb2Marshaller(); bean.setContextPath("ch.sahits.game.helloworld"); return bean; } @Override public void run(String... args) throws Exception { // 业务逻辑 } }
在Java 9环境下,JAXB相关的API和实现已经从JDK默认组件中移除,转为模块化的可选内容。如果不想额外定义模块,我们可以通过两种方式让Spring的Jaxb2Marshaller正常工作:
方法一:启动时添加模块参数
Java 9支持通过命令行参数手动加载需要的模块,你只需要在启动应用时加上--add-modules java.xml.bind参数即可:
java --add-modules java.xml.bind -jar your-spring-boot-app.jar
这个参数会通知JVM加载java.xml.bind模块,让Jaxb2Marshaller能找到所需的JAXB相关类。
方法二:引入JAXB相关依赖到项目
既然Java 9之后JAXB不再属于JDK的一部分,我们可以直接把JAXB的API和实现作为项目依赖引入,它们会被打包到应用的类路径中,无需额外的模块参数。
如果是Maven项目,在pom.xml中添加以下依赖:
<dependencies> <!-- JAXB API --> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> <!-- JAXB 核心实现 --> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.1</version> <scope>runtime</scope> </dependency> <!-- JAXB 核心工具类 --> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.0.1</version> </dependency> <!-- 激活API(JAXB依赖此组件) --> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency> </dependencies>
这些依赖属于自动模块,Java 9会自动从类路径加载它们,Spring的Jaxb2Marshaller就能正常初始化并运行了。
另外如果你使用的是Spring Boot 2.x及以上版本,框架已经做了部分自动配置,但添加上述依赖可以避免运行时出现ClassNotFoundException之类的问题。
内容的提问来源于stack exchange,提问作者hotzst
相关产品推荐
相关产品推荐

