使用Jaxb和JDK 9

时间:2017-09-28 16:29:58

标签: java jaxb applet java-9 java-module

我有一个Java applet,它提供了一个GUI来调用Web服务。它使用Jaxb来解析XML数据并将其解组为对象。它使用Java 1.5到1.8正确运行。使用Java 9,不是那么多。

我使用容器HTML在Internet Explorer 8 + JDK 9中启动它:

<applet code="com.blah.MyApplet" archive="myFatJarWithDependencies.jar" mayscript>
    <param name="cache_option" value="no" />
</applet>

小程序加载很好,似乎工作;但是,一旦我连接到Web服务,就会停止工作。 我已将其缩小到此代码片段(其中 Foo 是一个带有XML绑定注释的自动生成的类):

System.out.println("1");
JAXBContext jc = JAXBContext.newInstance(Foo.class);
System.out.println("2");

Java的控制台显示1,然后......没有:它没有崩溃,applet仍然响应鼠标点击,它不会抛出任何异常......似乎没有任何错误。除了它对接收到的数据没有做任何事情之外,它永远不会输出2。我尝试过其他JAXBContext.newInstance方法(包名,包名加上类加载器),但它们都是一样的。

如果我使用相同的JDK 9从Eclipse Oxygen运行项目, 的工作。当我连接到Web服务时,它会输出一些警告,包括:

WARNING: Illegal reflective access by com.sun.xml.bind.v2.runtime.reflect.opt.Injector 
(file:/C:/.../.m2/repository/com/sun/xml/bind/jaxb-impl/2.0/jaxb-impl-2.0.jar) to method
java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int)

WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access
operations

然后它继续并加载数据(并将2输出到控制台)。我的猜测是同样的问题,即使Java控制台中没有显示警告。 当JDK从IE运行时,JDK默认为--illegal-access=deny?或者&#34;默默地拒绝 - 所以 - 用户 - 不要发生什么线索&#34; ...

<罢工>

有什么方法可以将--illegal-access=permit选项传递给JVM吗?(请记住,我没有直接调用JVM,我只有一个<applet> html标签)

还有其他方法可以让它发挥作用吗?也许在我的applet的清单文件中添加额外的东西? (顺便说一句,这看起来像这样):

Manifest-Version: 1.0
Build-Jdk: 1.8.0_144
Application-name: Blah
Permissions: all-permissions
Sealed: true

Name: blah/Blah.class
SHA-256-Digest: kpf244234234..ahjsdfksf=
...

这些是我最初使用的Jaxb依赖项:

  • javax.xml.bind:jaxb-api:2.0
  • com.sun.xml.bind:jaxb-impl:2.0
  • com.sun.xml.bind:jaxb-xjc:2.0

我尝试将它们从v2.0更新到v2.3.0,are supposed to be compatible with Java 9

  • javax.xml.bind:jaxb-api:2.3.0
  • com.sun.xml.bind:jaxb-impl:2.3.0
  • com.sun.xml.bind:jaxb-core:2.3.0
  • com.sun.xml.bind:jaxb-xjc:2.3.0

但问题仍然存在。也在nullpointer's answer之后尝试了这些,但没有运气:

  • javax.xml.bind:jaxb-api:2.1
  • javax.xml:jaxb-impl:2.1
  • 删除了jaxb-xjc,显然它不需要......

1 个答案:

答案 0 :(得分:2)

当JDK从IE运行时,JDK默认为--illegal-access=deny吗?

不,JDK的当前默认模式仅为permit

  

--illegal-access=permit打开每个模块中的每个包   运行时映像到所有未命名模块中的代码,即代码   类路径,如果该包存在于JDK 8中。这将启用静态   访问,即通过编译的字节码,以及深反射访问,via   平台的各种反射API。

     

对任何此类包的第一次反射访问操作会导致a   发出警告,但在此之后没有发出警告。   此单个警告描述了如何启用进一步的警告。这个   警告无法抑制。

     

此模式是JDK 9中的默认模式。它将在未来逐步淘汰   释放,并最终删除。

还有其他方法可以让它发挥作用吗?

使用jaxb-api时,建议您按照this answer确保您的模块使用日志中显示的javax.xml.bind:jaxb-api:2.3.0代替com/sun/xml/bind/jaxb-impl/2.0/jaxb-impl-2.0.jar

您可以按照documentation here中的说明配置maven-compiler-plugin:3.7.0,以便在不同的执行中将源代码从1.5编译为JDK 8,在备用执行中编译JDK。

相关问题