【问题标题】:How to run code that uses JAXB under Java 1.9 when deployed via Java Web Start通过 Java Web Start 部署时如何在 Java 1.9 下运行使用 JAXB 的代码
【发布时间】:2018-03-06 18:34:53
【问题描述】:

我使用 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 中。

所以问题是,当通过使用 JAXB 的 Java 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>

【问题讨论】:

    标签: java java-web-start java-9


    【解决方案1】:

    根据 Java 9 迁移文档 --add-modulesModules Shared with Java EE Not Resolved by Default 部分,这是一种解决方法,因为 JAXB 将来会从 JDK 中删除。所以为了解决这个问题,我只是在我的类路径中包含了 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 实现确实会导致来自 Java 9 的非法反射访问警告。我认为很快就会发布不使用非法反射的更新。

    【讨论】:

    • 摆脱java.xml.bind 模块..+1
    【解决方案2】:

    参考相同的文档,您应该更改为使用等于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>
    

    默认情况下,版本属性指的是平台版本 Java平台标准版(规范版本)。 当前定义的平台版本为 1.2、1.3、1.4、1.5、1.6、1.7、 1.8 和 9。(平台版本通常不包含微版本号;例如 1.4.2。)


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

    【讨论】:

    • 你能分享你在其中找到的链接吗?对 Java 9 JNLP 文档的全文搜索没有找到那种措辞。
    • 该文档用于与“javapackager”命令行工具相对应的 ANT 任务,该工具是 JDK 的一部分,可让您构建本机可执行文件。它不适用于 Java Web Start。
    • @Michael 我的错,但可能更改版本应该在这里工作
    • 我还注意到 1.9 的正确版本是 version 属性中的 9 并且已经更改了它,它没有效果。
    • @Michael 假设您使用 9(用于 GA 构建)作为版本,您是否尝试过使用空格 [java-vm-args="--add-modules java.xml.bind"] 以及使用 =[java-vm-args="--add-modules=java.xml.bind"] 的参数?你得到什么错误?
    【解决方案3】:

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

    【讨论】:

    • --add-modules 参数的语法不正确。它不需要等号:--add-modules [,...]。但是,您确实是正确的,它是“java”而不是“javax”。我正在修复和测试(从命令行测试时正确,但在编辑 JNLP 时输入错误)。
    • 在我的应用程序启动时将其更改为 java.xml.bind 仍会导致“Thread-9”java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException。这似乎是因为 JNLP 的“java”标签的 java-vm-args 属性不支持 --add-modules。
    • JEP 293 (openjdk.java.net/jeps/293) 有 CLI 选项的指南。对于javajavac 启动,您可以使用空格或等号作为分隔符,对于API 和其他用法则只能使用等号。
    • 我并没有忽视使用等号的想法。我确实使用该语法对其进行了测试,但 VM 甚至都不会启动。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 2014-05-12
    • 1970-01-01
    • 2011-09-30
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多