web-dev-qa-db-ja.com

JDK9:不正なリフレクトアクセス操作が発生しました。 org.python.core.PySystemState

Javaelse(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

どうすれば修正できますか?スクリプト「dmelt.sh」の最後の行に-illegal-access = permitを追加しようとしていました(Linuxでbashを使用しています)が、この問題は解決しませんでした。私はこれにとてもイライラしています。私は非常に長い間、このプログラムを頻繁に使用していました。たぶん私はJDK9に移るべきではない

43
IraS

これを解決するideal方法は

これをorg.python.core.PySystemStateのメンテナーに報告する

そして、そのようなリフレクティブアクセスを今後修正するように依頼します。


ただし、デフォルトモードで不正なリフレクトアクセスが許可されている場合、将来のリリースでデフォルトモードではなくなったときに人々が驚かないように、それを知らせることが不可欠です。

メーリングリストのスレッド のいずれかから:

--illegal-access=permit

これは、JDK 9のdefaultモードになります。すべての明示的なモジュールのすべてのパッケージを開いて、すべての名前のないモジュールのコード、つまりクラスパスのコードを開きます。 、--permit-illegal-accessが今日するように。

最初の違法なリフレクティブアクセス操作により、--permit-illegal-accessと同様に警告が発行されますが、それ以降は警告は発行されません。この単一の警告は、さらに警告を有効にする方法を説明します。

--illegal-access=deny

これにより、--add-opensなどの他のコマンドラインオプションによって有効にされた操作を除き、すべての不正なリフレクトアクセス操作が無効になります。このは、将来のリリースでデフォルトモードになります。

以前と同様に、--add-exportsおよび--add-opensオプションを慎重に使用することにより、どのモードの警告メッセージも回避できます。


したがって、現在利用できる一時的な解決策は、 docs で説明されているように、VM引数として--add-exportsを使用することです。

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

モジュール宣言に関係なく、モジュールをexportパッケージにtarget-moduleに更新します。 target-moduleをすべてunnamedにして、すべての名前のないモジュールにエクスポートできます。

これにより、target-modulepackageのすべてのパブリックタイプにアクセスできます。カプセル化されたままのjdk内部クラスにアクセスする場合は、--add-opens引数を次のように使用してdeep reflectionを許可する必要があります。

--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が少なくとも1つのリリースでサポートされ続けることが期待されます。 permitwarn、およびdebugモードは、--illegal-accessオプション自体と同様に、時間が経つにつれて削除されます。

そのため、実装を変更し、それに対する理想的なソリューションに従うことをお勧めします。

33
Naman

DMeltはJythonを使用しているようで、この警告はJythonのメンテナーが対処する必要があるものです。ここで問題を追跡しています: http://bugs.jython.org/issue2582

6
Alan Bateman

このエラーを回避するには、maven-war-pluginを新しいものに再定義する必要があります。例えば:

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

P.S。jdk-12に対応

2
Drakonoved

実際の問題は、JDKの問題です。実際には不正なアクセスはありませんが、JDKメソッドtrySetAccessibleの動作は正しくありません。これは、将来のJDKバージョンで修正される予定です。

以下の答えを解決してみてください link

2
Thilina Sampath

この投稿によると、Jython開発者にはjdk9の実用的なソリューションがありません http://bugs.jython.org/issue2582 。前の説明は、何をすべきかを理解するには非常に長いようです。私はjdk9がjdk1.4-1.8とまったく同じように振る舞う、つまり完全に静かであることを望んでいます。後方比較におけるJVMの強度。 JDK9に追加オプションを追加しても問題ありませんが、新しい機能はアプリケーションを破壊できません

1
IraS

おそらく、以下の修正はJava 9でも機能します。

私の場合、Java open jdkバージョンは10.0.2で、同じエラーが発生しました(不正なリフレクティブアクセス操作が発生しました)。 LinuxでMavenをバージョン3.6.0にアップグレードすると、問題はなくなりました。

0
Rob Lassche