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