小编mab*_*abu的帖子

如何将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工具,我可以创建自己的专有JDK(通过OpenJFX增强):

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
Run Code Online (Sandbox Code Playgroud)

需要JavaFX的应用程序可以使用此专有JDK,而无需进行更改。

当我尝试将相同的方法应用于最新的JAXB beta时,出现以下错误:

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
Run Code Online (Sandbox Code Playgroud)

根据https://github.com/eclipse-ee4j/jaf/issues/13,“ JAXB API使用Activation-api作为其依赖项,由于缺少module-info而被迫将其用作自动模块或从类路径中使用.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, ...
Run Code Online (Sandbox Code Playgroud)

但是,当我使用生成的JDK运行应用程序时,出现如下错误:

!ENTRY org.eclipse.osgi 4 0 2019-02-15 15:58:58.642
!MESSAGE Application error
!STACK 1
org.eclipse.e4.core.di.InjectionException: java.lang.NoClassDefFoundError: javax/annotation/PostConstruct
    at …
Run Code Online (Sandbox Code Playgroud)

java module jaxb java-module java-11

7
推荐指数
1
解决办法
1437
查看次数

标签 统计

java ×1

java-11 ×1

java-module ×1

jaxb ×1

module ×1