我在试着运行dmelt程序(http://jwork.org/dmelt/)使用java9(jdk9)编程,它会给我一些错误,例如:
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”的最后一行添加–illegal access=permit(我在linux中使用bash),但这并没有解决这个问题。我对此感到非常沮丧。我经常使用这个程序,用了很长时间。也许我不该搬到jdk9
7条答案
按热度按时间ffscu2ro1#
dmelt似乎使用了jython,这个警告是jython维护人员需要解决的问题。这里有一个跟踪问题:http://bugs.jython.org/issue2582
dl5txlt92#
真正的问题是jdk中的一个问题。实际上没有非法访问,但是jdk方法trysetaccessible的行为是错误的。这将有望在未来的jdk版本中得到修复。
尝试解决下面的答案链接
plupiseo3#
要避免此错误,需要重新定义
maven-war-plugin
换个新的。例如:为…工作
jdk-12
.lbsnaicq4#
自java update 9以来,出现“非法反射访问操作已发生”警告。
删除警告消息。您可以用maven-war插件替换maven编译器插件和/或用pom.xml中的最新版本更新maven-war插件。以下是两个示例:
更改版本自:
收件人:
将artifactid和版本更改为:
收件人:
当我重新运行maven build或maven install时,“非法的反射访问操作已经发生”就消失了。
c7rzv4ha5#
解决这个问题的理想方法是
将此报告给org.python.core.pysystemstate的维护人员
并要求他们修复这些反射通道。
但是,如果默认模式允许非法的反射访问,那么就必须让人们知道这一点,这样人们在将来的版本中不再是默认模式时就不会感到惊讶了。
从邮件列表上的某个线程:
这将是JDK9的默认模式。它打开每个显式模块中的每个包,在所有未命名的模块中编写代码,即类路径上的代码,就像
--permit-illegal-access
今天有。第一个非法的反射访问操作导致发出警告,如
--permit-illegal-access
,但在此之后不会发出警告。这个警告将描述如何启用进一步的警告。这将禁用所有非法的反射访问操作,但由其他命令行选项(例如)启用的操作除外
--add-opens
. 这将成为未来版本中的默认模式。通过明智地使用
--add-exports
以及--add-opens
选项。因此,当前可用的临时解决方案是
--add-exports
作为文档中提到的vm参数:将模块更新为
export
打包到target-module
,而不考虑模块声明。这个target-module
可以将所有未命名的模块导出到所有未命名的模块。这将允许
target-module
访问中的所有公共类型package
. 如果您想访问仍将被封装的jdk内部类,则必须允许使用--add-opens
参数为:将模块更新为
open
打包到target-module
,而不考虑模块声明。在您的情况下,当前访问
java.io.Console
,您可以简单地将其添加为vm选项-另外,注意从上面链接的同一个线程
什么时候
deny
变成了默认模式permit
保持至少一个版本的支持,以便开发人员可以继续迁移他们的代码。这个permit
,warn
,和debug
随着时间的推移,模式将被删除,而--illegal-access
期权本身。因此,最好改变实现方式,并遵循理想的解决方案。
tzxcd3kk6#
也许下面的修复也适用于java 9:
在我的例子中,javaopenjdk版本是10.0.2,并且得到了相同的错误(发生了非法的反射访问操作)。我在linux上将maven升级到3.6.0版本,问题就消失了。
xienkqul7#
jython开发人员没有任何针对jdk9的实用解决方案http://bugs.jython.org/issue2582. 前面的解释似乎很长,不知道应该怎么做。我只希望jdk9的行为与jdk1.4-1.8完全相同,即完全保持沉默。jvm在向后可比性方面的优势。我完全可以在jdk9中使用其他选项,但是新特性不能破坏应用程序