为了账号安全,请及时绑定邮箱和手机立即绑定

如何将 JAXB 运行时库与 OpenJDK 11 捆绑在一起?

如何将 JAXB 运行时库与 OpenJDK 11 捆绑在一起?

明月笑刀无情 2022-06-23 16:20:40
背景:在我的组织中有很多基于 Java 的 Windows 桌面应用程序。在我们专有的软件部署系统中,应用程序不包含单独的 JRE / JDK。而是将一个通用 JRE(到目前为止是 Oracle 8 Java SE JRE)部署到用户机器上,它基于环境变量附加到各个应用程序。我们希望将 JRE 从 Oracle 8 Java SE JRE 迁移到 OpenJDK 11,而无需修改应用程序。从 Java 8 到 Java 11,各种库被删除,例如 JavaFX。使用 Java 模块系统和 jlink 工具,我可以创建自己的使用 OpenJFX 增强的专有 JDK:jlink --module-path ..\mods;C:\Temp\javafx-jmods-11.0.2 --add-modules=ALL-MODULE-PATH,java.base,java.compiler,java.datatransfer,java.desktop,... --output C:\Temp\OpenJDK+OpenJFX需要 JavaFX 的应用程序可以使用这个专有的 JDK 而无需更改。当我尝试将相同的方法应用于最新的 JAXB 测试版时,我收到以下错误:jlink --module-path ..\mods;C:\Temp\jaxb-ri-2.4.0-b180830.0438\jaxb-ri\mod --add-modules=java.xml.bind,java.base,java.compiler,java.datatransfer,java.desktop,java.instrument,... --output C:\Workspace\Java\OpenJDK_11.0.2_JFX_JAXBError: automatic module cannot be used with jlink: java.activation from file:///C:/Temp/jaxb-ri-2.4.0-b180830.0438/jaxb-ri/mod/javax.activation-api.jar根据https://github.com/eclipse-ee4j/jaf/issues/13,“ JAXB API 使用activation-api 作为其依赖项,并且由于缺少模块信息而被迫将其用作自动模块或来自类路径.java 描述符文件。 ”此外,根据是否可以在 JDK 11 上使用 jlink 来制作包含已删除的 Java SE EE 模块的运行时?我可以使用 Java 10 中的 jlink 捆绑模块 java.xml.bind,它仍然包含它。如果我将 OpenJDK 10.0.2 中的两个模块添加到模块路径中,则确实 jlink 成功:jlink --module-path ..\mods;C:\Temp\jdk-10.0.2\jmods\java.xml.bind.jmod;C:\Temp\jdk-10.0.2\jmods\java.activation.jmod --add-modules=java.xml.bind, ...
查看完整描述

4 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

尝试包含这两个依赖项:

    implementation group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.0'
    implementation group: 'org.glassfish.jaxb', name: 'jaxb-runtime'


查看完整回答
反对 回复 2022-06-23
?
狐的传说

TA贡献1804条经验 获得超3个赞

从版本 11 开始,JAXB 已从 JDK 中删除,您需要在添加所有其他依赖项时添加它。


Maven的示例:


<dependency>

    <groupId>javax.xml.bind</groupId>

    <artifactId>jaxb-api</artifactId>

    <version>${jaxb.api.version}</version>

</dependency>


<dependency>

    <groupId>com.sun.xml.bind</groupId>

    <artifactId>jaxb-core</artifactId>

    <version>${jaxb.api.version}</version>

</dependency>


<dependency>

    <groupId>com.sun.xml.bind</groupId>

    <artifactId>jaxb-impl</artifactId>

    <version>${jaxb.api.version}</version>

</dependency>


查看完整回答
反对 回复 2022-06-23
?
偶然的你

TA贡献1841条经验 获得超3个赞

如果您使用javaxAPI 模块,通常无法在不修改您的应用程序的情况下从 jdk8 升级。一些实现,例如com.sun自 jdk9 以来物理删除的包,您必须将它们添加为依赖项。

您也遇到java.lang.NoSuchMethodException了,因此当前可用的实现不再与javaxjdk10 的 API 兼容


查看完整回答
反对 回复 2022-06-23
?
Helenr

TA贡献1780条经验 获得超3个赞

我的组织最终屈服于在编译时修改应用程序。这不是我正在寻找的解决方案,但至少它对我们有用。



查看完整回答
反对 回复 2022-06-23
  • 4 回答
  • 0 关注
  • 170 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信