http://openjdk.java.net/jeps/247 をテキトーに訳した
JEP 247: Compile for Older Platform Versions
Owner Jan Lahoda Created 2014/09/10 16:56 Updated 2015/07/01 07:44 Type Feature Status Targeted Component tools/javac Scope JDK Discussion compiler dash dev at openjdk dot java dot net Effort M Duration L Priority 3 Reviewed by Alex Buckley, Brian Goetz, Jonathan Gibbons Endorsed by Brian Goetz Release 9 Issue 8058150
Summary
プラットフォームの旧バージョンで動かすためのJavaプログラムをコンパイル可能なようにjavac
を拡張する。
Motivation
javac
にある二つのコマンドラインオプション、-source
と-target
は、それぞれ、-source
はコンパイラが受け取るJava言語のバージョンを選択するために使われ、-target
はコンパイラが生成するクラスファイルのバージョンです。デフォルトでは、javac
はプラットフォームAPIの最新バージョンでコンパイルを行います。そのため、コンパイル後のプログラムはプラットフォームのカレントバージョンでだけ利用可能なAPIを使ってしまうことも可能です。こうしたプログラムはプラットフォームの旧バージョンでは、-source
と-target
オプションの値に関わらず、動作不可能です。ユーザはこれらのオプションを指定することで特定のプラットフォームバージョンで動作可能なクラスファイルを取得できるものだ、と想定するため、この事象は長い目で見るとユーザビリティにダメージを与えています。
Description
新しいコマンドラインオプション-platform
を定義し、このオプションは、指定のプラットフォームバージョン実装にリンクするクラスファイルを生成するようコンパイラを自動的に設定します。javac
に事前定義済みのプラットフォームにおいては、-platform N
は-source N -target N -bootclasspath <bootclasspath-from-N>
と同等です。
バージョンNのbootclasspathを得るには、プラットフォームの過去リリースのシグネチャデータが必要です。そのデータは$JDK_ROOT/lib/ct.sym
ファイルに格納されており、他バージョンでも同様ですが、しかし、JDk 8には同名のファイルはありません。ct.sym
ファイルはターゲットプラットフォームバージョンのクラスファイルに相当する必要最小限のクラスファイルを含むZIPファイルです。
-platform
実装の限界として、指定ターゲットプラットフォームのUnicodeバージョンはコンパイル中に使われず、代わりにカレントプラットフォームのUnicodeバージョンが使われます。
-platform
コマンドラインオプションは-source
, -target
, -bootclasspath
, -endorseddirs
を含む複数のjavac
オプションと互換性がありません。
一般的なプラットフォームは内部APIを使用してプラグイン可能と想定しており、また、プラグインされるプラットフォーム定義は-source
と-target
に加えて他のjavac
設定プロパティに、アノテーションプロセッサの追加やjavac Plugin
などの、影響を及ぼすことになると思われます。
現在二つの未解決問題があります。
- プラットフォームの指定ターゲットバージョンの
ct.sym
の全APIは-platform
オプションで選択可能、と想定しています。それとは別のJARファイルを扱う方法が未解決の問題です。そのJARファイルをbootstrapクラスパスに自動的に追加し、パスにそのJARファイルも引き続き追加するかどうか、が未解決の問題です*1。 - リリースの中間バージョンで行われるスタンドアローンなテクノロジのAPI変更を扱う方法についてが未解決です(例。JDK 6 updatesにおけるJAX-WSの2.0から2.1へのアップデート)。我々はAPI旧バージョンに対するコンパイルの決定を単純化するかもしれません。
Risks and Assumptions
JDKソースコードリポジトリは過去リリースのプラットフォームAPIのディスクリプションを含む必要があります。ディスクリプションのサイズは相当な量となり、結果としてJDKのビルドは大規模なものとなります。可能な限り容量オーバーヘッドを削除するよう注意する必要があります。
*1:How to handle other JAR files that are automatically added to the bootstrap class path, and even whether to continue adding them to that path, is an open question.が原文。訳に自信が無い