Java 9のjavac
には新しいフラグ--release
があります:
> javac --help
...
--release <release>
Compile for a specific VM version. Supported targets: 6, 7, 8, 9
-source
および-target
フラグとはどう違いますか?それは-source X -target X
の単なるショートカットですか?
ではない正確に。
JEP 247:古いプラットフォームバージョン用のコンパイル は、この新しいコマンドラインオプション--release
を定義します。
新しいコマンドラインオプション
--release
を定義しました。これは、指定されたプラットフォームバージョンの実装に対してリンクするクラスファイルを生成するようにコンパイラを自動的に構成します。javac
で事前定義されたプラットフォームの場合、--release N
は-source N -target N -bootclasspath <bootclasspath-from-N>
と同等です。 (エンファシス鉱山)
いいえ、それは-source N -target N
と同等ではありません。この追加の理由は、「動機」セクションに記載されています。
javac
は、2つのコマンドラインオプション、-source
と-target
を提供します。これらは、コンパイラが受け入れるJava言語のバージョンを選択するために使用できます。ただし、デフォルトでは、javac
は最新バージョンのプラットフォームAPIに対してコンパイルされるため、コンパイルされたプログラムは、現在のバージョンでのみ使用可能なAPIを誤って使用する可能性がありますプラットフォーム:このようなプログラムは、-source
および-target
。オプションに渡された値に関係なく、プラットフォームの古いバージョンでは実行できません。これらのオプションは、指定されたプラットフォームバージョンで実行できるクラスファイルを取得します。
要するに、ソースとターゲットのオプションを指定するだけでは、クロスコンパイルには不十分です。 javac
はデフォルトで最新のプラットフォームAPIに対してコンパイルされるため、古いバージョンでの実行を保証することはできません。正しくクロスコンパイルするには、古いバージョンに対応する-bootclasspath
オプションも指定する必要があります。これには、正しいバージョンのAPIが含まれ、古いバージョンでコンパイルして実行できるようになります。非常に頻繁に忘れられていたため、正しくクロスコンパイルするために必要なすべてのことを行う1つのコマンドラインオプションを追加することにしました。
さらに読む メーリングリスト内 および Oracle Docs 。元のバグが報告されました here 。このオプションが統合されて以来、JDKビルドには、「リスクと仮定」のセクションで説明した、古いリリースのプラットフォームAPIの説明がバンドルされていることに注意してください。つまり、クロスコンパイルが機能するためにマシンに古いバージョンをインストールする必要はありません。
--release X
は、-source X -target X
と-source
が古いリリースに安全にコンパイルするには不十分であるため、-target
への単なるショートカット以上のものです。また、古いリリースに対応する必要がある-bootclasspath
フラグを設定する必要があります(このフラグはしばしば忘れられます)。したがって、Java 9では、単一の--release
フラグを作成しました。これは、3つのフラグ-source
、-target
および-bootclasspath
の代わりになります。
したがって、これはJava 1.7にコンパイルする例です。
javac --release 7 <source files>
JDK 7をコンピューターにインストールする必要さえないことに注意してください。 JDK 9には、JDK 7には存在しなかったシンボルへの偶発的なリンクを防ぐために必要な情報がすでに含まれています。