Javaコンパイラ(javac
)を使用する場合、2種類の互換性を指定できます。1つは-source
を使用しており、もう1つは-target
を使用しています。これら2つの違いは何ですか?
たとえば、-source 1.5
および-target 1.6
?
また、異なるソースとターゲットの互換性レベルを使用するケースはありますか?
javac docs から:
-source受け入れられるソースコードのバージョンを指定します。
-target指定されたバージョンのVMをターゲットとするクラスファイルを生成します。クラスファイルは、指定されたターゲットとそれ以降のバージョンで実行されますが、以前のバージョンのVMでは実行されません。
あなたの例では:
-source 1.5 and -target 1.6
これは、ソースコードがJDK 1.5と互換性があることを確認するために使用されますが、JDK 1.6以降で使用するクラスファイルを生成する必要があります。
かなりなぜこれを行うのかは別の問題です。
-source
は、ソースコードのコンプライアンスレベルを示します。注釈を使用していますか?次に、少なくとも1.5
;使っていますか @override
インターフェースの実装では、1.6
など
-target
は、クラスを実行できるようにするJavaバージョンを指定します。Java SE 7
コンパイラとコンパイルJava SE 1.5
。
これは主に、古いバージョンのJavaで動作するjarファイルを生成するのに役立ちます。これまでのところ、すべてのJDKで古いバージョンを実行することもできるので、ソースよりも大きなターゲットにする理由はありません。
ただし、target
を次のように設定することには意味があります。 1.7 JDKを使用する場合は1.6。
確かではありませんが、1.7 Javaコードを1.7コンパイラを使用して1.6 jarにコンパイルすることは、たとえば次のような式でうまくいくと思います
ArrayList<Integer> foo = new ArrayList<>();
1.7+ソースバージョンでのみ有効なものは、1.6互換のバイトコードにコンパイルする必要があります。しかし、コンパイラが実際にこれを行うかどうかは確認していません。 残念ながら、これは実際には実装されていないようです。