我使用 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/