58

我正在尝试使用 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

4

9 回答 9

45

解决这个问题的理想方法是

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

并要求他们在未来修复这种反射访问。


但是,如果默认模式允许非法反射访问,那么必须让人们知道这一点,以免人们在未来版本中不再是默认模式时感到惊讶。

邮件列表中的一个线程

--illegal-access=permit

这将是 JDK 9 的默认模式。它打开每个显式模块中的每个包以在所有未命名模块中编码,即类路径上的代码,就像--permit-illegal-access今天一样。

第一次非法反射访问操作会导致发出警告,与 一样--permit-illegal-access,但在此之后不会发出警告。此单个警告将描述如何启用进一步的警告。

--illegal-access=deny

这将禁用所有非法反射访问操作,除了那些由其他命令行选项启用的操作,例如--add-opens. 这将成为未来版本中的默认模式。

--add-exports和以前一样,明智地使用and--add-opens选项可以避免任何模式下的警告消息。


因此,当前可用的临时解决方案是用作文档--add-exports中提到的 VM 参数:

--add-exports module/package=target-module(,target-module)*

无论模块声明如何,都将模块更新为exportpackage 。可以全部未命名以导出到所有未命名的模块target-moduletarget-module

这将允许target-module访问package. 如果您想访问仍将被封装的 JDK 内部类,则必须允许使用以下参数进行深度反射:--add-opens

--add-opens module/package=target-module(,target-module)*

无论模块声明如何,都将模块更新为openpackage 。target-module

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

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

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

deny成为默认模式时,我希望permit至少支持一个版本,以便开发人员可以继续迁移他们的代码。随着时间的推移, 、 和 模式将被删除,选项本身也将permitwarn删除。debug--illegal-access

所以最好改变实现并遵循理想的解决方案。

于 2017-09-15T02:11:15.320 回答
6

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

于 2017-09-15T06:46:24.640 回答
4

真正的问题是 JDK 中的问题。实际上没有非法访问,但是JDK方法trySetAccessible行为不端。这有望在未来的 JDK 版本中得到修复。

尝试解决下面的答案链接

于 2017-11-25T06:09:10.327 回答
4

为避免此错误,您需要重新定义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.

于 2019-03-29T20:03:11.647 回答
2

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

于 2017-09-16T18:53:05.073 回答
1

从 Java 更新 9 开始,出现“发生了非法反射访问操作”警告。

删除警告信息。您可以将 maven-compiler-plugin 替换为 maven-war-plugin 和/或使用 pom.xml 中的最新版本更新 maven-war-plugin。以下是 2 个示例:

从以下更改版本:

<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 时,“发生了非法反射访问操作”消失了。

于 2019-10-29T18:40:34.443 回答
0

在从事 Kotlin Spring 项目时来到这里。通过以下方式解决了该问题:

cd /project/root/
touch .mvn/jvm.config
echo "--illegal-access=permit" >> .mvn/jvm.config
于 2021-07-11T00:18:42.030 回答
0

最近的一些反馈。

如java错误代码中所述

WARNING: All illegal access operations will be denied in a future release

这个未来版本是 JDK 17,其中启动器参数--illegal-access将停止工作。

可在此处找到直接来自 Oracle 的更多信息:JEP 403 链接 1JEP 403 链接 2

通过此更改,最终用户将不再可能使用 --illegal-access 选项来启用对 JDK 内部元素的访问。(受影响的包列表可在此处获得。) sun.misc 和 sun.reflect 包仍将由 jdk.unsupported 模块导出,并且仍将打开,以便代码可以通过反射访问它们的非公共元素。不会以这种方式打开其他 JDK 包。

仍然可以使用 --add-opens 命令行选项或 Add-Opens JAR 文件清单属性来打开特定的包。

因此,该解决方案--add-opens module/package=target-module(,target-module)*和示例--add-opens java.base/java.io=ALL-UNNAMED将继续适用于 JDK 17 和未来版本,但--illegal-access不会。

于 2021-09-13T10:05:49.593 回答
0

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

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

于 2018-12-20T18:18:48.790 回答