[Java] Get Ready for Java 9

原文はこちら。
https://blogs.oracle.com/java/get-ready-jdk9

Java 9では、今日のモノリシックなJava SEプラットフォームから離脱するモジュラーシステムを導入します。広報互換性は主要な優先事項の一つであり、Oracleの開発チームはスムーズなJava 9への移行が可能になるよう取り組んできました。しかしながら、その下には数多くの大きな変更があり、これれは理解してもらう必要があります。この情報を知ることは、JavaOneのセッションを把握する上で有用であり、Java 9のリリースに対する準備にも有用です。
JDK 9
http://openjdk.java.net/projects/jdk9/
一般的な互換性ポリシーでは、サポート対象のAPIを事前の通知を持って除去することができる、と示しています。Enhanced Deprecationに関する JEP 277 では、通知プロセス、ステータス、意図されたAPIの処分だけでなく、アプリケーションにおける非推奨APIの静的な利用状況を分析するツールについて説明しています。
JEP 277: Enhanced Deprecation
http://openjdk.java.net/jeps/277
内部APIのカプセル化に関するJEP 260では、ほとんどの内部APIはデフォルトでアクセスできなくなりますが、いくつかの重要かつ幅広く利用されている内部APIはアクセスできるようにしておきます。ただし、それは全てもしくはほとんどの機能の置き換え対象ができあがるまでです。
JEP 260: Encapsulate Most Internal APIs
http://openjdk.java.net/jeps/260
一般的なルールとして、非サポートのAPIを使うべきではありません。ここで言う非サポートのAPIとは、ほとんどの場合、sun.misc.Unsafeのようなsun.*というAPIです。これらのAPIはOracle JDKチームが利用することを想定しており、Mark Reinholdが昨年のJVM Language Summitでsun.misc.Unsafeについて語っています。

JVMLS 2015 - The Secret History and Tragic Fate of sun.misc.Unsafe


JDK 9でもアクセス可能にすることを提案されている、内部APIは以下の通りです。
  • sun.misc.{Signal,SignalHandler}
  • sun.misc.Unsafe
    このクラスのメソッドの多くの機能は現在ではvariable handle(JEP 193)を使って利用可能
  • sun.reflect.Reflection::getCallerClass(int)
    このメソッドの機能はJEP 259を通じて標準形式で提供される
  • sun.reflect.ReflectionFactory.newConstructorForSerialization
上記の重要な内部APIはjdk.unsupportedという名前のJDK固有のモジュールに配置されます。またこれらのパッケージは、jdk.unsupportedモジュールからエクスポートされます。詳細はJEP 260のページでご覧いただけます。
JEP 260: Encapsulate Most Internal APIs
http://openjdk.java.net/jeps/260

How do you know whether your program uses or depends on any JDK-internal API?

ソースコードへアクセスできる場合は、ソースコード内のパッケージの名前から、これらのAPIを識別することができますが、こうしたAPIの一つに依存する3rdパーティのライブラリを使う場合があるため、時としてこれは問題になることがあります。こうしたAPIを識別するために、JDK 8で導入されたJdeps(Java dependency analysis tool)を使うことができますが、JDK 9の早期アクセス版で利用可能なJdepsの改良版を、使用する必要があるでしょう。 Mavenプラグインもあります。
Java Dependency Analysis Tool
https://wiki.openjdk.java.net/display/JDK8/Java+Dependency+Analysis+Tool
jdepsのコマンドを使って、Javaクラスファイルのパッケージレベルもしくはクラスレベルの依存性を表示します。 入力クラスは、全てのクラスファイルを分析するために、.classファイル、ディレクトリ、JARファイル、完全就職クラスへのパス名にすることができます。
デフォルトでは、jdepsは-classpathオプションと入力ファイルで指定された全てのクラスを分析します。 -jdkinternals を使って内部APIにフラグを立てる必要があるでしょう。より詳細情報はjdepsのページをご覧ください。
jdeps
http://docs.oracle.com/javase/8/docs/technotes/tools/unix/jdeps.html
このツールは利用者にJDK内部APIを利用していることを知らせ、変更ならびに利用可能であればサポートされる置換先を提示します。JDK内部APIの置換先の完全なリストは以下にあります。
Java Dependency Analysis Tool
https://wiki.openjdk.java.net/display/JDK8/Java+Dependency+Analysis+Tool
Alan Batemanがjdepsの使い方と、GlassfishのjarファイルやGradle 2.7から使った例を説明します。また、アップデートできない3rdパーティアプリケーションを使っている場合の回避策も説明しています。プレゼンテーションは以下のリンクをどうぞ。

CON5107 Prepare for JDK 9



Key links:

0 件のコメント:

コメントを投稿