python和java反射_java-JDK9:发生了非法的反射访问操作。 org.python.core.PySystem

java-JDK9:发生了非法的反射访问操作。 org.python.core.PySystem

我正在尝试使用Java9(JDK9)运行DMelt程序([http://jwork.org/dmelt/)]程序,它给了我以下错误:

WARNING: An illegal reflective access operation has occurred

WARNING: Illegal reflective access by org.python.core.PySystemState (file:/dmelt/jehep/lib/jython/jython.jar) to method java.io.Console.encoding()

WARNING: Please consider reporting this to the maintainers of org.python.core.PySystemState

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

WARNING: All illegal access operations will be denied in a future release

我该如何解决? 我试图将–illegal-access = permit添加到脚本“ dmelt.sh”的最后一行(我在Linux中使用bash),但这不能解决此问题。 我对此感到非常沮丧。 我经常使用此程序很长时间。 也许我永远不应该转向JDK9

IraS asked 2020-07-27T00:57:15Z

6个解决方案

34 votes

解决此问题的理想方法是

向org.python.core.PySystemState的维护者报告此情况

并要求他们修复此类反射访问方式。

但是,如果默认模式允许非法反射访问,则 至关重要的是要让人们知道 这不再是将来版本中的默认模式。

从邮件列表中的一个线程中:

--illegal-access=permit

这将是JDK 9的默认模式。它将打开其中的每个包。 每个显式模块都可以在所有未命名模块中进行编码,即在 就像今天的--add-exports一样。

第一次非法反射访问操作会导致警告 与--add-exports一起发布,但没有发出警告 在那之后。 此警告将说明如何启用 进一步的警告。

--illegal-access=deny

这将禁用所有非法反射访问操作,除了 由其他命令行选项启用的功能,例如--add-exports。 在将来的版本中,它将成为默认模式。

与以前一样,通过明智地使用--add-exports和deny选项,可以避免任何模式的警告消息。

因此,当前可用的临时解决方案是使用deny作为docs中提到的VM参数:

--add-exports module/package=target-module(,target-module)*

将模块更新为deny程序包更新为deny,无论 模块声明。 permit可以全部取消命名以导出到 所有未命名的模块。

这将允许deny访问permit中的所有公共类型。如果要访问仍要封装的jdk内部类,则必须使用permit参数允许进行深层反射,例如:

--add-opens module/package=target-module(,target-module)*

不管模块如何,将模块更新为deny程序包更新为deny 宣言。

对于当前要访问deny的情况,您可以简单地将其添加为VM选项-

--add-opens java.base/java.io=ALL-UNNAMED

另外,请注意与上面链接相同的线程

当deny成为默认模式时,我希望permit至少在一个版本中仍受支持,以便开发人员可以继续迁移其代码。 随着时间的推移,permit,warn和debug模式将被删除,--illegal-access选项本身也会被删除。

因此,最好更改实现并遵循理想的解决方案。

Naman answered 2020-07-27T00:58:42Z

6 votes

DMelt似乎在使用Jython,此警告是Jython维护人员需要解决的问题。 在这里跟踪它有一个问题:[http://bugs.jython.org/issue2582]

Alan Bateman answered 2020-07-27T00:59:02Z

2 votes

真正的问题是JDK中的问题。 实际上没有非法访问,但是JDK方法trySetAccessible行为异常。 希望在将来的JDK版本中可以解决此问题。

尝试解决下面的答案链接

Thilina Sampath answered 2020-07-27T00:59:26Z

2 votes

为避免此错误,您需要将jdk-12重新定义为更新的版本。 例如:

. . .

org.apache.maven.plugins

maven-war-plugin

3.2.2

附言 适用于jdk-12

Drakonoved answered 2020-07-27T00:59:50Z

1 votes

根据这篇文章[http://bugs.jython.org/issue2582.],Jython开发人员没有针对jdk9的任何实用解决方案。前面的解释似乎很长,无法弄清楚应该做什么。 我只希望jdk9的行为与jdk1.4-1.8完全一样,即完全保持沉默。 JVM在向后可比性方面的优势。 我完全可以在JDK9中使用其他选项,但是新功能不会破坏应用程序

IraS answered 2020-07-27T01:00:11Z

0 votes

也许以下修复程序也适用于Java 9:

在我的情况下,Java Open JDK版本为10.0.2,并得到了相同的错误(发生了非法的反射访问操作)。 我在Linux上将Maven升级到版本3.6.0,问题消失了。

Rob Lassche answered 2020-07-27T01:00:35Z

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值