Java 8 と Java 9を目標にした最近のJava Enhancement Proposalは、Javaコンパイラーによって使われる-target
と -source
ディレクティブのサポートモデルを成文化することを目指している。提案では、コンパイラーは、せいぜいJavaコンパイラー自身のバージョンの3つ前までサポートする、と言っている。
-target
フラグによって、コンパイラーはJavaクラスフォーマットの特定のバージョンをターゲットにできる。典型的には1.5 や 1.6のようにJavaバージョンが特定されるけれども、これは実際には生成される出力に使用されるバイトコードのバージョンに翻訳される。
- 48: Java 4
- 49: Java 5
- 50: Java 6
- 51: Java 7
- 52: Java 8 (未リリース)
- 53: Java 9 (未リリース)
-source
フラグによって、コンパイラーは、ラムダ、try-with-resources, strings-in-switch(switchに文字列が使える)などのような新しい言語要素を認識したり、あるいはエラーとして扱うことができる。幾つかの新言語フィーチャ(ラムダのような)は固有のバイトコードフィーチャ(invokedynamic
のような)を使う必要がある。結果として、ターゲットバージョンよりも新しいソースバージョンを使うことは、殆どの場合不可能である。
JEP 182 は、最大3バージョンの-target
と -source
がコンパイラーによって今後サポートされることを明言している。今年初めのJava 6の終焉によって、Java 8 コンパイラーではJava 6以降にサポートを制限(そして、Java 9コンパイラーではJava 7)、この制限が重要な障害にとなることは、誰にもないだろう。しかし、あるビルドツール(Mavenのような)では、特に指定しなければデフォルトでソースの互換バージョンが1.5である。これはJava 8上で走るにはアップデートが必要である。
変化はすでに始まっている。Java 8では、 jsr14
と 1.4
のターゲットはもはやで受け入れられていない。1.5
を使用すると警告を出す。Java 9がリリースされるときに、1.5
のサポートは削除され、1.6
に対しては警告を上げる。
実用的な観点から、これは大きな変化のように見えないかもしれません、しかし最近まで、OSGiのランタイムは、ジェネリックスを具現化できるコードを生成するために、-source 1.5 -target jsr14
でコンパイルされたが、J2MEと互換なバイトコードを生成する。jsr14
の使用は、Eclipseのコードベースから昨年取り除かれた。Androidは、ほとんどJ2MEを外した(とにかく、もし商業的な必要性があるなら、Felix と EquinoxなどのOSGiランタイムをまだ利用可能だ)ので、それらがもっと最近のランタイムでコンパイルされている事実は、大多数のJava開発者にとっては問題ではない。