JDK9でいくつかImcompatibleな問題に直面したので、ここにGitHubのIssueから、各プロダクトで挙がっているJDK9の不具合ポイントをまとめていきます。
java.specification.versionの体系変更
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の廃止
Intellij IDEAで発生していた問題ですが、sun.*パッケージのいくつかはjdk.internalパッケージに移され、本当にJDK内部でしかアクセスできないクラスになりました。(ちょっと前に廃止か?との噂があったsun.misc.Unsafeは、そのままアクセスできます。)
String内部のデータ表現がchar[]からbyte[]になった
JEP 254にしたがい、内部表現がUTF-16のchar配列だったのが、1バイトのみで扱えるものは1バイトで、それ以外は従来どおりUTF-16で持つように変更になりました。
String#toCharArrayでは、新しいchar[]に値がコピーされるので、その分の性能ロスを嫌って、直接Stringのvalueフィールドにアクセスしているようなプロダクトは影響を受けることになります。
AppClassLoaderがURLClassLoaderを継承しなくなった
Jigsaw対応のため、たいていの場合システムクラスローダーとして使われるAppClassLoaderが、URLClassLoaderを継承しなくなりました。
システムクラスローダーのクラスパスをURLClassLoaderにキャストして取得しているところは、ClassCastExceptionになるので、対応が必要になります。
((URLClassLoader) getClass().getClassLoader()).getURLs()
-XX:PermSize, -XX:MaxPermSizeの廃止
JDK8ですでに警告が出て無視されていましたが、JDK9ではオプション自体が削除されエラーになるようになりました。
その他
まだそれが原因で問題が出ているIssueは見当たりませんが…以下の変更があります。