显然,maven存储库中的com.sun.xml.bind: JAXB -impl工件被标记为"Old JAXB运行时模块“(请参阅下面的链接),但是这两个构件仍然在获得新的版本:
https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-impl
这个答案在Maven项目中,我应该为JAXB使用哪些工件?并没有澄清不同之处。
对于上述问题和这个如何解决java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException问题,公认的答案是,对于9+,您应该使用:org.Glassfish.jaxb:jaxb-9+-运行时。
但是我有使用com.sun.xml.bind:jaxb的代码,而且它似乎运行良好。那么,如果迁移到jaxb运行时,我会损失什么或得到什么呢?
即使是最新版本(在我编写此版本时为3.0.2),也可用于“旧”jaxb-impl模块。如果Oracle不再这样做,那么是谁制造com.sun.xml.bind:jaxb-impl工件呢?它是用来做什么的?为什么它不与jaxb运行时共享Maven组坐标?
是否有任何中心位置可以清楚地记录JAXB的当前状态?
现在JAXB有很多混乱之处。
我暂时需要与Java 8保持兼容,所以我现在还不能使用3.x,而2.4.x似乎是一种放弃的尝试,试图修复它们在将其从JDK中分离出来时愚蠢地破坏的模块化。
发布于 2022-05-07 10:47:30
jaxb-impl和jaxb-runtime之间唯一的区别是打包: jar中的jaxb-impl包栈/txw2 2,而jaxb-runtime通过单独的依赖关系提供它们。
版本兼容性与JakartaEE迁移
在最后一天,我一直在努力弄明白这件事,而且令人难以置信的困惑。特别是当您试图避免java.xml.bind到jakarta.xml.bind迁移时。在jaxb-impl 2.3.x发行版中到处都是过时的信息和一些坏版本。
据我所知,GlassFish提供了JAXB参考实现。它已经移到了EE4J,但是该项目的发布仍然针对这两组坐标。com.sun.xml.bind:jaxb-ri似乎是最新发布完整包的地方:
https://github.com/eclipse-ee4j/jaxb-ri/
在了解了这段历史之后,真正的混乱之处在于,没有一个工件在它们的工件坐标中反映javax.xml.bind到jakarta.xml.bind的移动,只反映在版本中。这意味着如果你生活在生态系统中,你需要两者都存在,那么你就会有一个糟糕的时期。
例如,2.3.3版本从依赖javax.xml.bind:jaxb-api更改为jakarta.xml.bind:jakarta.xml.bind-api,因为在2.x时,jakarta工件提供javax.xml.bind包。在3.0.0版本中,它提供了jakarta.xml.bind。
实现在3.0.0时相同,这意味着虽然早期版本可以在运行时愉快地存在,但您无法同时在构建工具中解决它们,冲突解决将打破javax.xml.bind API的遗留使用。
允许javax.xml.bind和jakarta.xml.bind共存
对于需要两种API共存而不需要迁移遗留代码的项目:
javax.xml.bind,使用com.sun.xml.bind:jaxb-impl:2.3.6。忽略3.0.0和更高版本。在javax.xml.bind:jaxb-api:2.3.1上添加显式依赖项,以便有一个提供javax.xml.bind API的包jakarta.xml.bind,使用最新的org.glassfish.jaxb:jaxb-runtime。忽略3.0.0之前的版本运行时与jakarta.xml.bind的兼容性
使用tomcat-jakartaee-迁移工具重写类,以便在构建时或部署时使用新的API。如果您使用Gradle,您可以在工件变换中使用这个。
迁移到jakarta.xml.bind
您可以根据打包的首选项使用运行时的任一坐标:
com.sun.xml.bind:jaxb-impl:4.0.0org.glassfish.jaxb:jaxb-runtime:4.0.0两者都依赖于带有jakarta.xml.bind:jakarta.xml.bind-api包命名空间的jakarta.xml.bind。
https://stackoverflow.com/questions/71095913
复制相似问题