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

标签 java java-web-start java-9

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

--add-modules java.xml.bind

Java Web Start 让您可以将 VM 参数传递给具有 java/j2se 标记的 java-vm-args 属性的应用程序。但是,仅支持文档中列出的参数,--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>

最佳答案

根据 Modules Shared with Java EE Not Resolved by Default Java 9 迁移文档 --add-modules 部分是一种变通方法,因为 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 - 当通过 Java Web Start 部署时,如何在 Java 1.9 下运行使用 JAXB 的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46411154/

相关文章:

Java FX 线程安全暂停/hibernate

java - JAVA中将列表放入数组

java - 使用 log4j 登录 Java Web Start

java - 在 Java 9 的 JShell 中创建模块

java - Java 9 ea 有启动时间倒退吗?

java - 暂停和恢复正在 hibernate 的 Java 线程

java - 在java中从CSV文件中提取值

java - 在 Webstart/JNLP 中部署 JavaFX

java - 如何自动化 Java Web 启动应用程序?

java - 在 java 9 Flow 上以一种只有一个订阅者会使用它的方式将数据发布给订阅者