Java 17之后,JAXB已经从标准Java库中移除,因此如果项目需要使用JAXB进行XML和Java对象之间的转换,就需要手动引入对应的依赖。不同的构建工具和不同的使用场景,需要的依赖配置也有所区别,下面会逐一说明。

Maven项目引入JAXB依赖
如果是使用Maven作为构建工具,需要根据是否使用JAXB的实现来添加不同的依赖。如果只是需要JAXB的API,可以添加以下依赖:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
如果还需要JAXB的运行时实现,需要额外添加GlassFish提供的实现依赖:
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.1</version>
</dependency>
使用Jakarta EE版本的JAXB依赖
如果项目使用的是Jakarta EE相关的规范,可以引入Jakarta版本的JAXB依赖,API依赖配置如下:
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>3.0.1</version>
</dependency>
对应的运行时实现依赖如下:
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>3.0.1</version>
</dependency>
Gradle项目引入JAXB依赖
对于使用Gradle构建的项目,引入JAXB依赖的方式和Maven类似,只是配置语法不同。如果需要JAXB的API,可以在build.gradle中添加如下配置:
dependencies {
implementation 'javax.xml.bind:jaxb-api:2.3.1'
}
如果需要添加运行时实现,配置如下:
dependencies {
implementation 'org.glassfish.jaxb:jaxb-runtime:2.3.1'
}
Jakarta版本Gradle配置
Jakarta版本的JAXB在Gradle中的配置如下,API依赖:
dependencies {
implementation 'jakarta.xml.bind:jakarta.xml.bind-api:3.0.1'
}
运行时实现依赖:
dependencies {
implementation 'org.glassfish.jaxb:jaxb-runtime:3.0.1'
}
依赖选择注意事项
在选择JAXB依赖版本时,需要注意以下几点:
- 如果项目是旧项目升级到Java 17,且原本使用的是
javax.xml.bind包下的类,优先选择2.x版本的JAXB依赖,避免修改大量代码。 - 如果是新项目,建议直接使用Jakarta版本的3.x依赖,符合新的Java EE规范演进方向。
- 依赖版本尽量选择稳定版本,避免使用过高的测试版本,防止出现兼容性问题。
- 如果项目中同时使用了其他XML处理相关的库,需要注意依赖冲突,可以通过构建工具的分析命令排查冲突。
简单使用示例
引入依赖之后,就可以正常使用JAXB的功能了,以下是一个简单的对象转XML的示例:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import java.io.StringWriter;
// 定义需要转换的实体类
class User {
private String name;
private int age;
public User() {}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
public class JaxbDemo {
public static void main(String[] args) throws Exception {
User user = new User("张三", 25);
JAXBContext context = JAXBContext.newInstance(User.class);
Marshaller marshaller = context.createMarshaller();
// 设置格式化输出
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
StringWriter writer = new StringWriter();
marshaller.marshal(user, writer);
System.out.println(writer.toString());
}
}
上述代码在引入正确的JAXB依赖后,就可以在Java 17环境中正常运行,输出对应的XML内容。