Какая разница между -source и -target совместимостью?
При использовании компилятора Java (javac
) мы можем указать два типа совместимости. Один использует -source
, а другой использует -target
. В чем разница между этими двумя?
Например, -source 1.5
и -target 1.6
?
Кроме того, существует ли какой-либо случай, когда мы используем другой уровень совместимости с исходным и целевым уровнем?
Ответы
Ответ 1
Из javac docs:
-source Указывает версию принятого исходного кода.
-target Генерировать файлы классов, предназначенные для указанной версии виртуальной машины. Файлы классов будут запускаться по указанному целевому объекту и в более поздних версиях, но не в более ранних версиях виртуальной машины.
В вашем примере:
-source 1.5 and -target 1.6
Это будет использоваться, чтобы убедиться, что исходный код совместим с JDK 1.5, но должен генерировать файлы классов для использования в JDK 1.6 и более поздних версиях.
Довольно, почему вы это сделали, это другое дело.
Ответ 2
-source
указывает, на каком уровне соответствия ваш исходный код: используете ли вы аннотации? Тогда вам понадобится как минимум 1.5
; вы используете @override
для реализации интерфейса, вам понадобится 1.6
и т.д.
-target
указывает, какую версию Java вы хотите использовать для запуска своих классов. Вы можете использовать компилятор Java SE 7
и выполнить компиляцию для запуска на Java SE 1.5
.
Ответ 3
Это в основном полезно для создания файла jar, работающего со старой версией Java.
Я считаю, что до сих пор все JDK также могут выполнять устаревшую версию, поэтому нет реальной причины иметь цель больше источника.
Однако имеет смысл установить target
, например. 1.6 при использовании 1,7 JDK.
Я не уверен, но я считаю, что в некоторых ситуациях он мог бы скомпилировать 1,7-й Java-код с использованием компилятора 1,7 для 1,6-й банеры, например выражения, такие как
ArrayList<Integer> foo = new ArrayList<>();
которые действительны только в версии версии 1.7+, должны скомпилировать 1,6-совместимый байт-код. Но я не проверял, действительно ли это сделает компилятор. К сожалению, это практически не реализуется на практике.