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に移るべきではない
これを解決する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-module
がpackage
のすべてのパブリックタイプにアクセスできます。カプセル化されたままの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つのリリースでサポートされ続けることが期待されます。 permit
、warn
、およびdebug
モードは、--illegal-access
オプション自体と同様に、時間が経つにつれて削除されます。
そのため、実装を変更し、それに対する理想的なソリューションに従うことをお勧めします。
DMeltはJythonを使用しているようで、この警告はJythonのメンテナーが対処する必要があるものです。ここで問題を追跡しています: http://bugs.jython.org/issue2582
このエラーを回避するには、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
に対応
実際の問題は、JDKの問題です。実際には不正なアクセスはありませんが、JDKメソッドtrySetAccessibleの動作は正しくありません。これは、将来のJDKバージョンで修正される予定です。
以下の答えを解決してみてください link
この投稿によると、Jython開発者にはjdk9の実用的なソリューションがありません http://bugs.jython.org/issue2582 。前の説明は、何をすべきかを理解するには非常に長いようです。私はjdk9がjdk1.4-1.8とまったく同じように振る舞う、つまり完全に静かであることを望んでいます。後方比較におけるJVMの強度。 JDK9に追加オプションを追加しても問題ありませんが、新しい機能はアプリケーションを破壊できません
おそらく、以下の修正はJava 9でも機能します。
私の場合、Java open jdkバージョンは10.0.2で、同じエラーが発生しました(不正なリフレクティブアクセス操作が発生しました)。 LinuxでMavenをバージョン3.6.0にアップグレードすると、問題はなくなりました。