LoginSignup
73
69

More than 5 years have passed since last update.

【随時更新】JDK9の非互換ポイント

Last updated at Posted at 2016-04-07

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は見当たりませんが…以下の変更があります。

73
69
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
73
69