[解決済み] JVM引数なしでJava 9の警告 "Illegal reflective access "を隠すには?
2023-04-21 22:01:01
質問
Java9でサーバを動かそうとしたら、次のような警告が出ました。
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by io.netty.util.internal.ReflectionUtil (file:/home/azureuser/server-0.28.0-SNAPSHOT.jar) to constructor java.nio.DirectByteBuffer(long,int)
WARNING: Please consider reporting this to the maintainers of io.netty.util.internal.ReflectionUtil
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=deny
をJVMのオプションに追加することなく、この警告を隠したい。何か、こんな感じ。
System.setProperty("illegal-access", "deny");
何か方法はないでしょうか?
すべての関連する回答は、JVMオプションを使用することを示唆していますが、私はコードからこれをオフにしたいと思います。それは可能ですか?
明確にするために - 私の質問は、同様の質問で述べられたように、JVM引数/フラグを介してではなく、コードからこの警告を回すことです。
どのように解決するのですか?
不正アクセスの警告を無効にする方法がありますが、あまりお勧めできません。
1. 簡単な方法
警告はデフォルトのエラーストリームに出力されるので、単純にこのストリームを閉じ、リダイレクトして
stderr
を
stdout
.
public static void disableWarning() {
System.err.close();
System.setErr(System.out);
}
注意事項
- この方法は、エラーと出力のストリームをマージします。それはいくつかのケースでは望ましくないかもしれません。
-
を呼び出すだけでは、警告メッセージをリダイレクトすることはできません。
System.setErr
エラーストリームへの参照はIllegalAccessLogger.warningStream
フィールドに保存されるため、エラーストリームへの参照はJVMブートストラップの早い段階で
2. stderr を変更しない複雑なアプローチ
良い知らせは
sun.misc.Unsafe
は、JDK 9 ではまだ警告なしでアクセスできることです。解決策は、内部の
IllegalAccessLogger
をリセットすることです。
public static void disableWarning() {
try {
Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafe.setAccessible(true);
Unsafe u = (Unsafe) theUnsafe.get(null);
Class cls = Class.forName("jdk.internal.module.IllegalAccessLogger");
Field logger = cls.getDeclaredField("logger");
u.putObjectVolatile(cls, u.staticFieldOffset(logger), null);
} catch (Exception e) {
// ignore
}
}
関連
-
Eclipseは、ポップアップA Java Exception has occurred.を実行し、エラーException in threadの解決策を報告します。
-
型に解決できない エラー解決
-
ajax コミット リソースの読み込みに失敗しました: サーバーはステータス 400 で応答しました ()
-
JAVA_HOME環境変数が正しく定義されていない問題を解決する
-
Junitのユニットテストはjava.lang.Testを報告します。
-
BindException: アドレスはすでに使用中です:バインドエラー解決
-
SocketException java.netの4つの例外解決策。
-
コンストラクタDate()が未定義である問題
-
IDEAError:javaの依存性エラー。Annotation processing is not supported for module cycles...(アノテーション処理はモジュールサイクルではサポートされていません。
-
linux ant Resolve error: main class not found or couldn't be loaded org.apache.tools.ant.launcher.
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
実行中にEclipseがポップアップする A Java Exception has occurred
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException:5 エラー
-
が 'X-Frame-Options' を 'sameorigin' に設定したため、フレーム内に存在する。
-
Javaジェネリックを1つの記事で
-
FindBugの使用概要
-
maven レポート エラー 解決不可能な親POM
-
Java の double データ型における 0.0 と -0.0 の問題
-
Zipファイルの圧縮・解凍にantを使用する
-
ApiModel と @ApiModelProperty の使用法
-
swagger2 モデルが表示されない モデルが見つからない @ApiModel アノテーションが表示されない問題