この記事は、Fujitsu Advent Calendarの12/18の記事です。
12月に入って、突然、Incubator ModuleがOpenJDK JEP 11として登録されました。この記事では、このIncubator Moduleについて簡単に紹介します。
##Incubator Moduleとは
Incubator Moduleは簡単に言うと、正式なJava SEの仕様ではないが、お試し版としてOpenJDKに入れるモジュールのことです。現在、HTTP/2などが候補となっています。
このJEP11は、他のJEPと違っている点が2つあります。
一つは、冒頭で「突然」と言いいましたが、JEP2.0のプロセスでは、通常、ステータスがCandidate(OpenJDKのロードマップに入る)になる前に、メーリングリストなどで議論されることになっていますが、今回は特になかったようです。
もう一つは、番号が11番になっていること。JEPの番号は101番から振られて、現在302番まであります。(1番はJEP自身のこと、2番はテンプレートで、3~100までは欠番になっていました。)新しいJEPなら303番になるはずが、これまで使われてこなかった11番が割り当てられています。
この2点について、そうなっている理由は共通で、Incubator Moduleが、Feature JEPではなく、Informational JEPであるためです。Informational JEPは、Feature JEPのワークフローにのらないということで、特別な議論なくCandidateになり、番号もFeature JEPとは違う採番になりました。ただし、Information JEPはこれまでも他にあり、101番以降が使われています。(例 JEP 188: Java Memory Model Update)
##仕様
Incubator Moduleのライフタイムは限定的で、その機能がJCPで標準化されないなら、削除されることになります。
Incubator Moduleのモジュール名は、「jdk.incubator.xxx」とします。
Incubatorの機能は、Incubator Moduleからのみ、exportされます。将来、この機能が標準化された暁には、パッケージ名が変わり、Incubator Module以外のモジュールからexportされます。Incubator ModuleとそのAPIはなくなることがありますが、その場合「@Deprecated」アノテーションはつけるべきではないとされています。Deprecatedとは別の概念です。したがって、Incubator Moduleを使う場合は、将来の非互換についてリスクを取る必要があります。
Incubator Moduleは、Incubator機能のみをexportでき、「java.」とか「javax.」のAPIをexportできません。Incubator Moduleは、「jdk.unsupported」モジュールとも関係なく、sun.misc.Unsafe等のAPIもexportできません。
Incubator Moduleは、JREには含まれません。JDKランタイムには含まれますが、アプリケーションから自動的に使うことはできません。アプリケーションから使うには、javaコマンドに「--add-modules」オプションが必要となります。
##背景
OpenJDKは、OSSである一方で、Java SEのRI(参照実装)という側面があります。Java SEの仕様はJCPで標準化されますが、それ以外の機能をOpenJDKは自由に加えることは可能です。ただし、RIにある機能がde-fact標準になってしまう恐れがあり、そうなるとJCPでの標準化の意義が薄れてしまいます。ですが、そうは言っても、JCPでの標準化には時間がかかり、最新技術をタイムリーに提供できないのも困ります。
というようなジレンマを解決するための施策のようですが、本当に解決になっているのかどうなのかという議論はあります。