All About ACS: ACS+Java 17 で「WARNING: A terminally deprecated method in java.lang.System has been called」などのメッセージ


ACS+Java 17 で「WARNING: A terminally deprecated method in java.lang.System has been called」などのメッセージ

Java 17 は 最新の Java のバージョンで、最新の LTS でもあります。
また、Oracle JDK のライセンスが変更され、Oracle JDK 17 から再び無料で利用できるようになりました。

そこで、ACS 1.1.8.8 を Oracle JDK 17 上動かす環境を作りました。

すると、いくつか警告が出るのに気か付きました。

WARNING: A terminally deprecated method in java.lang.System has been called

「java -jar acsbundle.jar」で実行します。
「WARNING: A terminally deprecated method in java.lang.System has been called」など、いくつかの WARNING がでました。
ACS が java.lang.System の setSecurityManager メソッドを呼び出してることへのメッセージのようです。

C:\acs\Win64>oracle-jdk-17\bin\java -jar acsbundle.jar
WARNING: A terminally deprecated method in java.lang.System has been called
WARNING: System::setSecurityManager has been called by com.ibm.iaccess.launch.AcsLaunchPad (file:/C:/acs/Win64/acsbundle.jar)
WARNING: Please consider reporting this to the maintainers of com.ibm.iaccess.launch.AcsLaunchPad
WARNING: System::setSecurityManager will be removed in a future release

JEP 411: Deprecate the Security Manager for Removal」に説明がありました。
Security Manager を将来なくすので、利用している場合、Java 17 から警告を出すようになったようです。

なお、Java 17 では警告を出すものの「実行を許可する」のがデフォルトですが、Java 18 では「実行を許可しない」がデフォルトになるようです。

Starting in Java 18, the default value of java.security.manager will be disallow if not otherwise set via java -D.... As a result, applications and libraries that call System::setSecurityManager may fail due to an unexpected UnsupportedOperationException. In order for System::setSecurityManager to work as before, the end user will have to set java.security.manager to allow on the command line (java -Djava.security.manager=allow ...).

さらに 18 以降、徐々に Security Manager API の機能を縮小するようです。

In Java 18 and later, we will degrade other Security Manager APIs so that they remain in place but with limited or no functionality. For example, we may revise AccessController::doPrivileged simply to run the given action, or revise System::getSecurityManager always to return null. This will allow libraries that support the Security Manager and were compiled against previous Java releases to continue to work without change or even recompilation. We expect to remove the APIs once the compatibility risk of doing so declines to an acceptable level.

もちろん、Java 18 は世の中に出ていないので、この機能縮小がどのような影響を ACS に与えるか不明です。

warning: Ignoring option --illegal-access=permit; support was removed in 17.0

Java 17 を利用して「acslaunch_win-64.exe」を実行すると、上記の警告の他に「warning: Ignoring option --illegal-access=permit; support was removed in 17.0」が出ます。

C:\acs\Win64>acslaunch_win-64.exe
Java HotSpot(TM) 64-Bit Server VM warning: Ignoring option --illegal-access=permit; support was removed in 17.0
WARNING: A terminally deprecated method in java.lang.System has been called
WARNING: System::setSecurityManager has been called by com.ibm.iaccess.launch.AcsLaunchPad (file:/C:/acs/Win64/acsbundle.jar)
WARNING: Please consider reporting this to the maintainers of com.ibm.iaccess.launch.AcsLaunchPad
WARNING: System::setSecurityManager will be removed in a future release

これは「JEP 403: Strongly Encapsulate JDK Internals」の変更の影響です。

JDK 17の内部JDK要素の強力なカプセル化」の説明が分かりやすいです。

Java 9 から安全でない 内部 API の呼び出しの許可/不許可の制御ができるようになりました。
実行される場合は「WARNING: An illegal reflective access operation has occurred」が出力されたりしていました。

ACS でも以前は、このメッセージが出ていましたが「All About ACS: 「WARNING: An illegal reflective access operation has occurred」は ACS 1.1.8.3 で対応済み」のように 1.1.8.3 で対応が行われました。

一方「acslaunch_win-64.exe」は、安全でない 内部 API の呼び出しを許可するオプション「--illegal-access=permit」を内部的に指定して JVM を作成しているようです。
ACS 本体で対応が行われた 1.1.8.3 以降では不要なはずですが、「acslaunch_win-64.exe」の内部処理の指定からは削除されていないのでしょう。

Java 17 から、安全でない 内部 API の呼び出しは常に「不許可」になりました。
当然、許可を求める「--illegal-access=permit」は Java 17 には意味がありません。
無効なオプションを付けているけど無視するからね、という警告をわざわざ出すようにしたんですね。


2021-09-30 作成
2021-11-17 「1.1.8.8」を「1.1.1.8」と記載していたことを修正


「All About ACS」では IBM i に対する新しいクライアント「IBM i Access Client Solutions」の情報をいろいろ提供していきます。
記事一覧はこちらで確認いたけます。

許可の無い転載を禁じます。
この記事は筆者の個人的な責任で無保証で提供しています。
当記事に関してIBMやビジネスパートナーに問い合わせることは、固くお断りします。