java 不输出 jc.log_关于Java:使用Jaxb和JDK 9的applet中的非法反射访问

我有一个Java小程序,它提供了一个GUI来调用Web服务。它使用Jaxb解析XML数据并将其解组为对象。它可以在Java 1.5到1.8上正确运行。有了Java 9,就没那么多了。

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

小应用程序可以很好地加载,并且似乎可以运行。但是,一旦我连接到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,我只有一个 html标记) strike>

还有其他方法可以使它起作用吗?也许在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,该版本应该与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的答案之后也尝试了这些,也没有运气:

javax.xml.bind:jaxb-api:2.1

javax.xml:jaxb-impl:2.1

删除了jaxb-xjc,显然这不是必需的...

我希望有人能够帮助您解决该问题,但是我建议现在是重新构建该特定前端的时候了。 这些天,Applet在很大程度上已经死亡。

实际上,在Java 9中也已弃用了applet api:openjdk.java.net/jeps/289

是的,我知道...但这并不是我可以做出的决定。 即使他们批准了将小程序更改为其他内容的预算,仍然需要将其嵌入在IE8中运行的HTML页面中。 所以...

@ElliottFrisch即使applet死了,JAXB也不应该吗?

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

否,JDK的当前默认模式仅是permit。

--illegal-access=permit opens each package in each module in the

run-time image to code in all unnamed modules, i.e., to code on the

class path, if that package existed in JDK 8. This enables both static

access, i.e., by compiled bytecode, and deep reflective access, via

the platform's various reflection APIs.

The first reflective-access operation to any such package causes a

warning to be issued, but no warnings are issued after that point.

This single warning describes how to enable further warnings. This

warning cannot be suppressed.

This mode is the default in JDK 9. It will be phased out in a future

release and, eventually, removed.

还有其他方法可以使它起作用吗?

对于使用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。

我已经在使用javaxs jaxb-api,来自sun的一个是jaxb-impl。无论如何,我也替换了它(用所有相关的依赖项更新了问题),但是它仍然做同样的事情。我没有得到的是...为什么它在Eclipse和IE8中表现不同?它是相同的JDK。

@AJPerez在eclipse中使用时,使用什么Java版本?在IE中,您的默认Java版本是什么?

我在IE和Eclipse中都使用JDK 9 build 181运行applet。 Eclipse本身使用相同的JDK运行。我正在使用1.8.0_144进行编译,但这没关系,对吧?

@AJPerez理想情况下,我将使用相同或更高版本(而不是较低版本)来编译代码。或者,如果这就是您的意思,请确保如何在jdk1,8上编译模块化代码。

我试图用Java 9进行编译,而Maven 3.3失败了。 Ive发现了另一个问题,您(在这个世界很小的地方.. :)建议更新到Maven 3.5,Ive刚刚完成了该工作。现在,它告诉我"不再支持源选项1.5",所以我要么告诉Maven使用不同于javac的编译器,要么放弃整个Java 9支持...

@AJPerez此处的编译器插件配置将帮助您编译-1.5。在答案中也进行了更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值