43

Javaコンパイラ(javac)を使用する場合、2種類の互換性を指定できます。1つはを使用して-sourceおり、もう1つはを使用してい-targetます。これら2つの違いは何ですか?

たとえば、-source 1.5および-target 1.6

また、異なるソースとターゲットの互換性レベルを使用する場合はありますか?

4

3 に答える 3

39

javacドキュメントから:

-source受け入れられるソースコードのバージョンを指定します。

-target指定されたバージョンのVMを対象とするクラスファイルを生成します。クラスファイルは、指定されたターゲットとそれ以降のバージョンで実行されますが、VMの以前のバージョンでは実行されません。

あなたの例では:

-source 1.5 and -target 1.6

これは、ソースコードがJDK 1.5と互換性があることを確認するために使用されますが、JDK1.6以降で使用するためのクラスファイルを生成する必要があります。

なぜこれを行うのは別の問題です。

于 2012-05-19T08:06:36.583 に答える
12

-source、ソースコードのコンプライアンスレベルを示します。アノテーションを使用していますか?次に、少なくとも1.5;が必要になります。インターフェイスの実装で使用@overrideしていますか、必要になるでしょう1.6など

-target、クラスを実行できるようにするJavaのバージョンを指定します。Java SE7コンパイラを使用して、JavaSEで実行するようにコンパイルできます1.5

于 2012-05-19T08:09:41.247 に答える
7

これは主に、古いバージョンのJavaで動作するjarファイルを作成する場合に役立ちます。これまでのところ、すべてのJDKが古いバージョンも実行できると思います。したがって、ターゲットをソースより大きくする本当の理由はありません。

ただしtarget、1.7 JDKを使用する場合は、たとえば1.6に設定するのが理にかなっています。

よくわかりませんが、1.7コンパイラを使用して1.7Javaコードを1.6jarにコンパイルすると、状況によっては機能する可能性があると思います。たとえば、次のような式などです。

ArrayList<Integer> foo = new ArrayList<>();

1.7以降のソースバージョンでのみ有効なものは、1.6互換のバイトコードにコンパイルする必要があります。しかし、コンパイラが実際にこれを行うかどうかは確認していません。残念ながら、これは実際には実装されていないようです。

于 2012-05-19T08:25:35.550 に答える