当通过JavaWebStart部署时,如何在Java1.9下运行使用JAXB的代码

当通过JavaWebStart部署时,如何在Java1.9下运行使用JAXB的代码,java,java-web-start,java-9,Java,Java Web Start,Java 9,我使用JavaWebStart部署了三个应用程序到客户端。这三个应用程序都使用JAXB。在Java 1.9下,要加载jaxb模块,必须使用: --add-modules java.xml.bind JavaWebStart让您将VM参数传递给具有Java/j2se标记的JavaVM args属性的应用程序。但是,仅支持文档中列出的参数,并且不支持--add modules 所以问题是,当通过使用JAXB的JavaWebStart运行代码时,如何将“--addmodules java.xml.b

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

--add-modules java.xml.bind
JavaWebStart让您将VM参数传递给具有Java/j2se标记的JavaVM args属性的应用程序。但是,仅支持文档中列出的参数,并且不支持
--add modules

所以问题是,当通过使用JAXB的JavaWebStart运行代码时,如何将
“--addmodules java.xml.bind”
传递到1.9VM

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

<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.xml.bind”。这将为您提供
java vm args=“--add modules=java.xml.bind”
参考相同的文档,您应该更改为使用等于
9
9+
(ea构建)的版本,如下所示:


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


我之前也提出并回答了一个永久性的解决方案,而不是依靠不推荐使用的
java.xml.bind
对代码进行这样的临时修复。

根据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"/> 

它附带了一些可传递的依赖项(FastInfo集、istack commons、stax ex和txw2)。这些都是桌面swing应用程序,所以我喜欢将jar文件保持在尽可能小的位置,在pack200压缩后,它只为我的胖jar增加了大约600K


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

对于--add modules参数来说,这是不正确的语法。它不接受等号:--添加模块[,…]。然而,您确实正确地认为它是“java”而不是“javax”。我正在修复和测试(在从命令行测试时它是正确的,但在编辑JNLP时键入了错误的)。将它更改为java.xml.bind仍然会导致“Thread-9”java.lang.NoClassDefFoundError:javax/xml/bind/jaxbeException,当我的应用程序启动时。这似乎是因为JNLP的“java”标记的java vm args属性不支持--add modules。JEP 293()提供了CLI选项的指导原则。对于
java
javac
启动,则可以使用空格或equals作为分隔符,对于API和其他用途,则只能使用equals。对于立即使用等号的想法,我没有打折。我用这种语法测试了它,虚拟机甚至不会启动。你能分享你在中找到的链接吗?对Java9JNLP文档的全文搜索并没有找到这样的措辞。该文档用于对应于“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”
]这两种方法?您会遇到什么错误?为了摆脱
java.xml.bind
模块…+1
 <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"/>