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

时间:2017-09-15 01:36:15

标签: 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

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

7 个答案:

答案 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,以便开发人员可以继续迁移他们的代码。随着时间的推移,permitwarndebug模式将被删除,--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