Javax 到雅加达的迁移:GlassFish JAXB 4.x 读取 Jakarta.xml.bind.annotations*,但不读取 javax.xml.bind.annotations.*

javax to jakarta migration: glassfish JAXB 4.x reads jakarta.xml.bind.annotations* but not javax.xml.bind.annotations.*

提问人:Julien Kronegg 提问时间:10/25/2023 更新时间:11/20/2023 访问量:67

问:

背景

我正在使用以下库将 XML 解组到 Java:

<dependency>
  <groupId>org.glassfish.jaxb</groupId>
  <artifactId>jaxb-runtime</artifactId>
  <version>2.3.1</version>
</dependency>

解组代码如下所示:

 MyClass instance = JAXBContext.newInstance(MyClass.class)
                               .createUnmarshaller()
                               .unmarshal(new StreamSource(getClass().getClassLoader()
                                    .getResourceAsStream("myfile.xml")), MyClass.class)
                               .getValue();

它运作良好。

问题

我正在尝试迁移到库的 4.0.2 版:

 <dependency>
  <groupId>org.glassfish.jaxb</groupId>
  <artifactId>jaxb-runtime</artifactId>
  <version>4.0.2</version>
</dependency>

运行代码时,发生错误:

Two classes have the same XML type name "someType". Use @XmlType.name and @XmlType.namespace to assign different names to them.

分析

在我的类层次结构中有两个类“SomeType”(在不同的命名空间中)。这两个类由 进行批注。类层次结构打包为库,并在多个应用程序之间共享。javax.xml.bind.annotation.XmlType

使用 2.3.1 运行时,JAXB 类会读取注释:jaxb-runtimeClassInfoImpljavax.xml.bind.annotation.XmlType

    this.elementName = this.parseElementName(clazz);
    XmlType t = (XmlType)this.reader().getClassAnnotation(XmlType.class, clazz, this);
    this.typeName = this.parseTypeName(clazz, t);

但是,当使用 4.0.2 运行时,JAXB 类会读取 new(注意前缀而不是前缀)。jaxb-runtimeClassInfoImpljakarta.xml.bind.annotation.XmlTypejakartajavax

当然,找不到注解(因为它不是同一个包),所以会发生错误。XmlType

问题

除了通过更改 from to 注释来更新我的库中的类之外,还有其他解决方案吗?javaxjakarta

Java XML JAXB 雅加达迁移

评论

1赞 Rob Spoor 10/25/2023
不,没有。这是 Jakarta EE 9 及更高版本的主要缺点 - 所有使用的现有代码都需要切换到 .javaxjakarta

答:

0赞 Laurent Schoelens 11/20/2023 #1

JAXB 4 是 JakartaEE 10 的一部分,而 JAXB 2.3 是 JavaEE 8 的一部分

主要的变化是从 JakartaEE 9 开始的软件包变化(有关 Java 生态系统中这一巨大变化的详细信息,请参见此处)。javax.*jakarta.*

现在由JakartaEE负责的eclipse基金会创建了这个工具(eclipse transformer),以帮助用户进行这种迁移,因为很难改变用户想要使用JakartaEE世界的代码库。

如果您无法更改 java 源代码(基于包),并且该源代码捆绑在应用程序使用的特定 jar 中(应该是这种情况,因为 jaxb4 是 jdk11 基线,并且您没有抱怨 undefined 的编译错误,因为从 JDK9 开始不再包含在 JDK 中),您可能有兴趣使用 eclipse maven transformer 插件javaxjavax.xml.bind.annotation.XmlTypejaxb-runtime

希望这能帮助您按预期工作。

评论

0赞 Julien Kronegg 11/21/2023
这回答了我最初的问题(“有没有其他方法”),但与此同时,我已经迁移了我的库。
0赞 Laurent Schoelens 11/21/2023
在我看来,这是迁移库的最佳且面向未来的选择,但在无法迁移的库上,这是一个不错的选择