我正在尝试使用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
答案 0 :(得分:31)
理想解决此问题的方法是
向org.python.core.PySystemState的维护者报告
并要求他们继续修复这种反思性访问。
然而,如果默认模式允许非法反射访问 让它成为知名人士并不会感到惊讶 这不再是未来版本中的默认模式。
来自threads on the mailing list之一:
--illegal-access=permit
这将是JDK 9的默认模式。它将打开每个包 每个显式模块在所有未命名的模块中编码,即代码开启 类路径,就像今天
--permit-illegal-access
一样。第一次非法反射访问操作会导致警告 与
--permit-illegal-access
一样发布,但没有发出警告 在那之后。此单个警告将描述如何启用 进一步的警告。
--illegal-access=deny
这将禁用所有非法反射访问操作,除了 由其他命令行选项启用的选项,例如
--add-opens
。 将在以后的版本中成为默认模式。
通过明智地使用--add-exports
和--add-opens
选项,可以避免任何模式下的警告消息。
因此,当前可用的临时解决方案是使用--add-exports
作为docs中提到的VM参数:
--add-exports module/package=target-module(,target-module)*
将模块更新为
export
包裹到target-module
,无论如何 模块声明。target-module
可以全部未命名导出到 所有未命名的模块。
这将允许target-module
访问package
中的所有公共类型。如果你想访问仍然封装的jdk内部类,你必须使用--add-opens
参数允许深度反射:
--add-opens module/package=target-module(,target-module)*
将模块更新为
open
包到target-module
,无论模块如何 声明。
在您的情况下,当前访问java.io.Console
,您只需将其添加为VM选项 -
--add-opens java.base/java.io=ALL-UNNAMED
另外,请注意上面链接的同一个帖子
当deny
成为默认模式时,我希望至少有一个版本支持permit
,以便开发人员可以继续迁移他们的代码。随着时间的推移,permit
,warn
和debug
模式将被删除,--illegal-access
选项本身也将被删除。
因此,最好更改实施并遵循理想的解决方案。
答案 1 :(得分:6)
DMelt似乎使用Jython,这个警告是Jython维护者需要解决的问题。这里有跟踪它的问题: http://bugs.jython.org/issue2582
答案 2 :(得分:1)
根据这篇文章http://bugs.jython.org/issue2582,Jython开发人员没有任何实用的jdk9解决方案。 之前的解释似乎很长,以确定应该做什么。我只是希望jdk9的行为与jdk1.4 - 1.8完全相同,即完全无声。 JVM在后向可比性方面的优势。我完全可以在JDK9中有其他选项,但新功能不能破坏应用程序
答案 3 :(得分:0)
也许以下修复程序也适用于Java 9:
在我的情况下,Java Open JDK版本为10.0.2,并出现了相同的错误(发生了非法的反射式访问操作)。我在Linux上将maven升级到版本3.6.0,问题不再存在。
答案 4 :(得分:0)
为避免此错误,您需要将maven-war-plugin
重新定义为较新的版本。例如:
<plugins>
. . .
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
</plugins>
PS 适用于jdk-12
答案 5 :(得分:0)
自Java 9更新以来,出现“发生了非法的反射访问操作”警告。
我在eclipse.ini中添加了--illegal-access = permit,但是在从Maven创建eclipse的构建时,它不能解决警告。
尝试替换Maven编译插件。当我确实按照以下示例从jdk1.8升级到jdk1.12时,通过在多个项目中修改pom.xml文件,已从Maven Build和Maven Install中解决了此问题:
更改版本:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
<webXml>WebContent\WEB-INF\web.xml</webXml>
</configuration>
</plugin>
收件人:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
<webXml>WebContent\WEB-INF\web.xml</webXml>
</configuration>
</plugin>
并且还更改了artifactId和版本自:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
收件人:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
当我重新运行Maven Build或Maven Install时,“发生了非法的反射访问操作”
答案 6 :(得分:0)
在处理 Kotlin Spring 项目时来到这里。通过以下方式解决了该问题:
cd /project/root/
touch .mvn/jvm.config
echo "--illegal-access=permit" >> .mvn/jvm.config