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

背景:


在我的组织中有很多基于 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_JAXB

Error: 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, ...


明月笑刀无情
浏览 171回答 4
4回答

收到一只叮咚

尝试包含这两个依赖项:    implementation group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.0'     implementation group: 'org.glassfish.jaxb', name: 'jaxb-runtime'

狐的传说

从版本 11 开始,JAXB 已从 JDK 中删除,您需要在添加所有其他依赖项时添加它。Maven的示例:<dependency>&nbsp; &nbsp; <groupId>javax.xml.bind</groupId>&nbsp; &nbsp; <artifactId>jaxb-api</artifactId>&nbsp; &nbsp; <version>${jaxb.api.version}</version></dependency><dependency>&nbsp; &nbsp; <groupId>com.sun.xml.bind</groupId>&nbsp; &nbsp; <artifactId>jaxb-core</artifactId>&nbsp; &nbsp; <version>${jaxb.api.version}</version></dependency><dependency>&nbsp; &nbsp; <groupId>com.sun.xml.bind</groupId>&nbsp; &nbsp; <artifactId>jaxb-impl</artifactId>&nbsp; &nbsp; <version>${jaxb.api.version}</version></dependency>

偶然的你

如果您使用javaxAPI 模块,通常无法在不修改您的应用程序的情况下从 jdk8 升级。一些实现,例如com.sun自 jdk9 以来物理删除的包,您必须将它们添加为依赖项。您也遇到java.lang.NoSuchMethodException了,因此当前可用的实现不再与javaxjdk10 的 API 兼容

Helenr

我的组织最终屈服于在编译时修改应用程序。这不是我正在寻找的解决方案,但至少它对我们有用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java