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