JDK9:发生了非法的反射访问操作.org.python.core.PySystemState

Ira*_*raS 44 java java-9 java-module

我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)

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

Nam*_*man 34

解决这个问题的理想方法是

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

并要求他们在未来修复这种反思性访问.


但是,如果默认模式允许非法反射访问,则必须使其成为已知,这样当人们不再是未来版本中的默认模式时,人们不会感到惊讶.

邮件列表中的一个主题:

--illegal-access=permit
Run Code Online (Sandbox Code Playgroud)

这将是JDK 9 的默认模式.它打开每个显式模块中的每个包,以编码所有未命名的模块,即类路径上的代码,就像--permit-illegal-access今天一样.

第一次非法反射访问操作会发出警告--permit-illegal-access,但在此之后不会发出警告.此单个警告将描述如何启用进一步警告.

--illegal-access=deny
Run Code Online (Sandbox Code Playgroud)

这将禁用所有非法反射访问操作,但其他命令行选项启用的操作除外--add-opens.这将成为未来版本中的默认模式.

通过明智地使用--add-exports--add-opens选项,可以像以前一样避免任何模式下的警告消息.


因此,当前可用的临时解决方案是--add-exports用作文档中提到的VM参数:

--add-exports module/package=target-module(,target-module)*
Run Code Online (Sandbox Code Playgroud)

更新模块以export打包到target-module,无论模块声明如何.该target-module可全部无名出口到所有未命名的模块.

这将允许target-module访问所有公共类型package.如果你想访问仍然被封装的jdk内部类,你必须允许使用参数进行深度反射--add-opens:

--add-opens module/package=target-module(,target-module)*
Run Code Online (Sandbox Code Playgroud)

更新模块以open打包到target-module,无论模块声明如何.

在你的情况下,当前访问java.io.Console,你可以简单地将其添加为VM选项 -

--add-opens java.base/java.io=ALL-UNNAMED
Run Code Online (Sandbox Code Playgroud)

另外,请注意上面链接的同一个帖子

deny成为默认模式时,我希望permit至少有一个版本支持,以便开发人员可以继续迁移他们的代码.的permit,warndebug模式将随着时间的推移,被去除,如将在本--illegal-access选项本身.

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


Ala*_*man 6

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