jdk9:发生非法的反射访问操作org.python.core.pysystemstate

l3zydbqr  于 2021-05-27  发布在  Hadoop
关注(0)|答案(7)|浏览(507)

我在试着运行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

ffscu2ro

ffscu2ro1#

dmelt似乎使用了jython,这个警告是jython维护人员需要解决的问题。这里有一个跟踪问题:http://bugs.jython.org/issue2582

dl5txlt9

dl5txlt92#

真正的问题是jdk中的一个问题。实际上没有非法访问,但是jdk方法trysetaccessible的行为是错误的。这将有望在未来的jdk版本中得到修复。
尝试解决下面的答案链接

plupiseo

plupiseo3#

要避免此错误,需要重新定义 maven-war-plugin 换个新的。例如:

<plugins>
    . . .
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.2</version>
    </plugin>
</plugins>

为…工作 jdk-12 .

lbsnaicq

lbsnaicq4#

自java update 9以来,出现“非法反射访问操作已发生”警告。
删除警告消息。您可以用maven-war插件替换maven编译器插件和/或用pom.xml中的最新版本更新maven-war插件。以下是两个示例:
更改版本自:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    ...

    ...
</plugin>

收件人:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.3.1</version>
    ...
     ...
</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>
    </configuration>
</plugin>

收件人:

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.3.1</version>
        <executions>
            <execution>
                <id>prepare-war</id>
                <phase>prepare-package</phase>
                <goals>
                    <goal>exploded</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

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

c7rzv4ha

c7rzv4ha5#

解决这个问题的理想方法是
将此报告给org.python.core.pysystemstate的维护人员
并要求他们修复这些反射通道。
但是,如果默认模式允许非法的反射访问,那么就必须让人们知道这一点,这样人们在将来的版本中不再是默认模式时就不会感到惊讶了。
从邮件列表上的某个线程:

--illegal-access=permit

这将是JDK9的默认模式。它打开每个显式模块中的每个包,在所有未命名的模块中编写代码,即类路径上的代码,就像 --permit-illegal-access 今天有。
第一个非法的反射访问操作导致发出警告,如 --permit-illegal-access ,但在此之后不会发出警告。这个警告将描述如何启用进一步的警告。

--illegal-access=deny

这将禁用所有非法的反射访问操作,但由其他命令行选项(例如)启用的操作除外 --add-opens . 这将成为未来版本中的默认模式。
通过明智地使用 --add-exports 以及 --add-opens 选项。
因此,当前可用的临时解决方案是 --add-exports 作为文档中提到的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 期权本身。
因此,最好改变实现方式,并遵循理想的解决方案。

tzxcd3kk

tzxcd3kk6#

也许下面的修复也适用于java 9:
在我的例子中,javaopenjdk版本是10.0.2,并且得到了相同的错误(发生了非法的反射访问操作)。我在linux上将maven升级到3.6.0版本,问题就消失了。

xienkqul

xienkqul7#

jython开发人员没有任何针对jdk9的实用解决方案http://bugs.jython.org/issue2582. 前面的解释似乎很长,不知道应该怎么做。我只希望jdk9的行为与jdk1.4-1.8完全相同,即完全保持沉默。jvm在向后可比性方面的优势。我完全可以在jdk9中使用其他选项,但是新特性不能破坏应用程序

相关问题