More than 1 year has passed since last update.

JDK9でいくつかImcompatibleな問題に直面したので、ここにGitHubのIssueから、各プロダクトで挙がっているJDK9の不具合ポイントをまとめていきます。

java.specification.versionの体系変更

https://github.com/hibernate/hibernate-validator/pull/457/

JDK9からは、JEP 223にともない、バージョン番号の表記が変わりました。そして、システムプロパティjava.specification.versionの返す値も従来の「1.8」みたいな値から「9-ea」が返ってくるようになっています。

このため、HibernateValidatorでは、以下の箇所でArrayIndexOutOfRangeExceptionが出てしまっていました。

String[] specificationVersion = System.getProperty( "java.specification.version" ).split( "\\." );

return Integer.parseInt( specificationVersion[1] );

sun.misc.VMの廃止

https://github.com/JetBrains/intellij-community/commit/f50e99ed18268b7cd0d66d4bdef0d0c481c0d6ad

Intellij IDEAで発生していた問題ですが、sun.*パッケージのいくつかはjdk.internalパッケージに移され、本当にJDK内部でしかアクセスできないクラスになりました。(ちょっと前に廃止か?との噂があったsun.misc.Unsafeは、そのままアクセスできます。)

String内部のデータ表現がchar[]からbyte[]になった

JEP 254にしたがい、内部表現がUTF-16のchar配列だったのが、1バイトのみで扱えるものは1バイトで、それ以外は従来どおりUTF-16で持つように変更になりました。

https://github.com/hazelcast/hazelcast/pull/5799

String#toCharArrayでは、新しいchar[]に値がコピーされるので、その分の性能ロスを嫌って、直接Stringのvalueフィールドにアクセスしているようなプロダクトは影響を受けることになります。

AppClassLoaderがURLClassLoaderを継承しなくなった

https://github.com/Mojang/LegacyLauncher/pull/11

Jigsaw対応のため、たいていの場合システムクラスローダーとして使われるAppClassLoaderが、URLClassLoaderを継承しなくなりました。

システムクラスローダーのクラスパスをURLClassLoaderにキャストして取得しているところは、ClassCastExceptionになるので、対応が必要になります。

((URLClassLoader) getClass().getClassLoader()).getURLs()

-XX:PermSize, -XX:MaxPermSizeの廃止

JDK8ですでに警告が出て無視されていましたが、JDK9ではオプション自体が削除されエラーになるようになりました。

その他

まだそれが原因で問題が出ているIssueは見当たりませんが…以下の変更があります。