当通过 Java Web Start 部署时,如何 运行 在 Java 1.9 下使用 JAXB 的代码

How to run code that uses JAXB under Java 1.9 when deployed via Java Web Start

我使用 Java Web Start 将三个应用程序部署到客户端。所有这三个应用程序都使用 JAXB。在 Java 1.9 下,要加载 jaxb 模块,您必须使用:

--add-modules java.xml.bind

Java Web Start 允许您使用 java/j2se 标记的 java-vm-args 属性将 VM 参数传递给应用程序。但是,仅支持文档中列出的参数,--add-modules 不在 that list.

所以问题是当通过 Java 使用 JAXB 的 Web Start 运行 代码时,如何将 "--add-modules java.xml.bind" 传递给 1.9 VM?

这是我尝试过的,我的测试表明 java-vm-arg 属性确实不支持 --add-modules:

<resources>
    <property name="jnlp.packEnabled" value="true"/>
    <java version="9" java-vm-args="--add-modules java.xml.bind"/>
    <java version="1.8+"/>
    <jar href="redacted.jar"/>
</resources>

使用等号而不是 space。模块名称也是 "java.xml.bind"。这给你 java-vm-args="--add-modules=java.xml.bind".

参考相同的文档,您应该更改为使用等于 99+(ea 构建)的版本:

<resources> 
    <property name="jnlp.packEnabled" value="true"/>
    <j2se version="9" java-vm-args="--add-modules java.xml.bind"/>
    <j2se version="1.8+"/>
    <jar href="redacted.jar"/>
</resources>

The version attribute refers, by default, to a platform version (specification version) of the Java Platform Standard Edition. Currently defined platform versions are 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, and 9. (A platform version does not usually contain a micro version number; for example 1.4.2.)


我之前也做出了 and that 的回答来解释永久解决方案,而不是对依赖于已弃用的 java.xml.bind 的代码进行此类临时修复。

根据 Java 9 迁移文档的 Modules Shared with Java EE Not Resolved by Default 部分,--add-modules 是一种变通方法,因为将来会从 JDK 中删除 JAXB。所以为了解决这个问题,我只是在我的类路径中包含了 JAXB API 和一个实现,使用 ANT+Ivy 这个配置得到了我需要的东西:

 <dependency org="org.glassfish.jaxb" name="jaxb-runtime" rev="2.3.0"/>
 <dependency org="org.glassfish.jaxb" name="jaxb-core" rev="2.3.0"/>
 <dependency org="javax.xml.bind" name="jaxb-api" rev="2.3.0"/>
 <dependency org="javax.activation" name="activation" rev="1.1.1"/> 

一些传递依赖项随之而来(FastInfoset、istack-commons、stax-ex 和 txw2)。这些是桌面 swing 应用程序,所以我希望 jar 文件尽可能小,在 pack200 压缩后它只增加了大约 600K 到我的 fat jar。

glassfish 实现确实导致来自 Java9 的非法反射访问警告。我想很快就会发布一个不使用非法反射的更新。