[英]“WARNING: An illegal reflective access operation has occurred” with JDK 8 installed
[英]Illegal reflective access in an applet with Jaxb and JDK 9
我有一个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控制台中没有显示警告。
当从IE运行时,JDK默认为
--illegal-access=deny
?
或者
“默默地否认 - 所以 - 用户 - 不要发生什么线索” ......
有什么办法可以将
--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依赖项:
我尝试将它们从v2.0更新到v2.3.0,它们应该与Java 9兼容 :
但问题仍然存在。 在nullpointer的回答之后也试过这些,没有运气:
当从IE运行时,JDK默认为--illegal-access=deny
?
不,JDK的当前默认模式仅为permit
。
--illegal-access=permit
打开运行时映像中每个模块中的每个包,以编码所有未命名的模块 ,即在类路径上编码,如果该包存在于JDK 8中。这将启用静态访问,即,通过编译的字节码和深度反射访问,通过平台的各种反射API。对任何此类包的第一次反射访问操作会导致发出警告,但在该点之后不会发出警告。 此单个警告描述了如何启用进一步的警告。 无法抑制此警告。
此模式是JDK 9中的默认模式 。 它将在未来的版本中逐步淘汰,并最终被删除。
有没有其他方法可以使它工作?
对于使用jaxb-api
,建议你按照这个答案来确保你的模块使用javax.xml.bind:jaxb-api:2.3.0
而不是com/sun/xml/bind/jaxb-impl/2.0/jaxb-impl-2.0.jar
如日志中所示。
您可以按照此处的文档中的说明配置maven-compiler-plugin:3.7.0
,以便在不同的执行中将源代码从1.5编译为JDK 8,在备用执行中编译JDK。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.