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

Java JDK9:发生了非法的反射访问操作。org.python.core.PySystemState,java,java-9,java-module,Java,Java 9,Java Module,我正在尝试使用Java9(JDK9)运行DMelt programs()程序,它会给我带来如下错误: 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.en

我正在尝试使用Java9(JDK9)运行DMelt programs()程序,它会给我带来如下错误:

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
我怎样才能修好它?我试图在脚本“dmelt.sh”(我在Linux中使用bash)的最后一行添加–非法访问=许可证,但这并没有解决这个问题。我对此感到非常沮丧。我经常使用这个程序,用了很长时间。也许我永远不应该转到JDK9,解决这个问题的理想方法是

将此报告给org.python.core.PySystemState的维护人员

并要求他们在未来修复这种反射通道


但是,如果默认模式允许非法反射访问,则 让人们知道这一点是很重要的,这样人们在 这不再是未来版本中的默认模式

来自以下其中一个:

这将是JDK 9的默认模式。它会打开每个包 每个显式模块在所有未命名模块中编码,即,在 类路径,正如
--允许非法访问
今天所做的那样

第一个非法反射访问操作将导致发出警告 发布,与
一样--允许非法访问
,但不发布警告 在那之后。此警告将描述如何启用 进一步警告

这将禁用除以下操作之外的所有非法反射访问操作: 由其他命令行选项(如
--add)启用的选项将打开。
此将成为未来版本中的默认模式

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


因此,当前可用的临时解决方案是使用
--add exports
作为VM参数,如下所述:

将模块更新为
导出
将包导出为
目标模块
,而不考虑 模块声明。
目标模块
可以全部未命名以导出到 所有未命名的模块

这将允许
目标模块
访问
中的所有公共类型。如果您希望访问仍将被封装的JDK内部类,则必须使用
--add opens
参数允许深度反射,如下所示:

--add-opens module/package=target-module(,target-module)*
将模块更新为
打开
将包更新为
目标模块
,而不考虑模块 声明

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

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

另外,注意上面链接的同一个线程

deny
成为默认模式时,我希望
permit
至少支持一个版本,以便开发人员可以继续迁移他们的代码。随着时间的推移,
允许
警告
调试
模式将被删除,
--非法访问
选项本身也将被删除


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

DMelt似乎使用Jython,而这个警告是Jython维护人员需要解决的问题。此处有一个跟踪问题:
根据这篇文章,Jython开发人员没有任何针对jdk9的实用解决方案。
前面的解释似乎很长,无法解释应该做什么。我只希望jdk9的行为与jdk1.4-1.8完全相同,即完全保持沉默。JVM在向后可比性方面的优势。我完全可以在JDK9中使用其他选项,但新功能不能破坏应用程序,真正的问题是JDK中的一个问题。实际上没有非法访问,但JDK方法trySetAccessible的行为不正常。这有望在未来的JDK版本中得到修复


尝试解决以下问题回答

也许下面的修复程序也适用于java 9:


在我的例子中,JavaOpenJDK版本是10.0.2,并且得到了相同的错误(发生了非法的反射访问操作)。我在linux上将maven升级到3.6.0版,问题就解决了

为了避免这个错误,您需要将
maven-war插件重新定义为一个更新的插件。例如:


. . .
org.apache.maven.plugins
maven战争插件
3.2.2


适用于
jdk-12

自Java update 9以来,出现“非法反射访问操作已发生”警告

以删除警告消息。您可以使用maven war插件替换maven编译器插件和/或在pom.xml中使用最新版本更新maven war插件。以下是两个例子:

将版本更改为:


org.apache.maven.plugins
maven战争插件
2.4
...
...
致:


org.apache.maven.plugins
maven战争插件
3.3.1
...
...
从以下位置更改artifactId和版本:


org.apache.maven.plugins
maven编译器插件
3.5.1
1.8
1.8
致:


org.apache.maven.plugins
maven战争插件
3.3.1
备战
准备包装
爆炸了的

当我重新运行Maven Build或Maven Install时,“非法的反射访问操作已经发生”就消失了。

看来Jython 2,7开发人员也不知道该怎么做。他们的上一次报告是在2017年4月。他们还没有解决这个问题。这个问题需要修改Jython代码,该代码正在攻击java.io.Console中的私有编码方法。该警告提醒我们,一旦对JDK内部的访问被阻止,黑客将被破解。当然,您可以通过打开java.io包进行深度反射来解决这个问题(
--add opens java.base/java.io=ALL-UNNAMED
--add-exports module/package=target-module(,target-module)*
--add-opens module/package=target-module(,target-module)*
--add-opens java.base/java.io=ALL-UNNAMED