原文はこちら。
https://blogs.oracle.com/java/get-ready-jdk9
Java 9では、今日のモノリシックなJava SEプラットフォームから離脱するモジュラーシステムを導入します。広報互換性は主要な優先事項の一つであり、Oracleの開発チームはスムーズなJava 9への移行が可能になるよう取り組んできました。しかしながら、その下には数多くの大きな変更があり、これれは理解してもらう必要があります。この情報を知ることは、JavaOneのセッションを把握する上で有用であり、Java 9のリリースに対する準備にも有用です。
JDK 9でもアクセス可能にすることを提案されている、内部APIは以下の通りです。
デフォルトでは、jdepsは
https://blogs.oracle.com/java/get-ready-jdk9
Java 9では、今日のモノリシックなJava SEプラットフォームから離脱するモジュラーシステムを導入します。広報互換性は主要な優先事項の一つであり、Oracleの開発チームはスムーズなJava 9への移行が可能になるよう取り組んできました。しかしながら、その下には数多くの大きな変更があり、これれは理解してもらう必要があります。この情報を知ることは、JavaOneのセッションを把握する上で有用であり、Java 9のリリースに対する準備にも有用です。
JDK 9一般的な互換性ポリシーでは、サポート対象のAPIを事前の通知を持って除去することができる、と示しています。Enhanced Deprecationに関する JEP 277 では、通知プロセス、ステータス、意図されたAPIの処分だけでなく、アプリケーションにおける非推奨APIの静的な利用状況を分析するツールについて説明しています。
http://openjdk.java.net/projects/jdk9/
JEP 277: Enhanced Deprecation内部APIのカプセル化に関するJEP 260では、ほとんどの内部APIはデフォルトでアクセスできなくなりますが、いくつかの重要かつ幅広く利用されている内部APIはアクセスできるようにしておきます。ただし、それは全てもしくはほとんどの機能の置き換え対象ができあがるまでです。
http://openjdk.java.net/jeps/277
JEP 260: Encapsulate Most Internal APIs一般的なルールとして、非サポートのAPIを使うべきではありません。ここで言う非サポートのAPIとは、ほとんどの場合、
http://openjdk.java.net/jeps/260
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
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 Tooljdepsのコマンドを使って、Javaクラスファイルのパッケージレベルもしくはクラスレベルの依存性を表示します。 入力クラスは、全てのクラスファイルを分析するために、.classファイル、ディレクトリ、JARファイル、完全就職クラスへのパス名にすることができます。
https://wiki.openjdk.java.net/display/JDK8/Java+Dependency+Analysis+Tool
デフォルトでは、jdepsは
-classpath
オプションと入力ファイルで指定された全てのクラスを分析します。 -jdkinternals
を使って内部APIにフラグを立てる必要があるでしょう。より詳細情報はjdepsのページをご覧ください。jdepsこのツールは利用者にJDK内部APIを利用していることを知らせ、変更ならびに利用可能であればサポートされる置換先を提示します。JDK内部APIの置換先の完全なリストは以下にあります。
http://docs.oracle.com/javase/8/docs/technotes/tools/unix/jdeps.html
Java Dependency Analysis ToolAlan Batemanがjdepsの使い方と、GlassfishのjarファイルやGradle 2.7から使った例を説明します。また、アップデートできない3rdパーティアプリケーションを使っている場合の回避策も説明しています。プレゼンテーションは以下のリンクをどうぞ。
https://wiki.openjdk.java.net/display/JDK8/Java+Dependency+Analysis+Tool
CON5107 Prepare for JDK 9
Key links:
- JEP 277: Enhanced Deprecation
http://openjdk.java.net/jeps/277 - JEP 260: Encapsulate Most Internal APIs
http://openjdk.java.net/jeps/260 - JDeps tool
https://wiki.openjdk.java.net/display/JDK8/Java+Dependency+Analysis+Tool - Java 9 early access
https://jdk9.java.net/download/ - JDK 9に関するJavaOne 2016 のセッションリスト
https://oracle.rainfocus.com/scripts/catalog/oow16.jsp?event=javaone&search=JDK%209&search.event=javaone