Подтвердить что ты не робот

Какая разница между -source и -target совместимостью?

При использовании компилятора Java (javac) мы можем указать два типа совместимости. Один использует -source, а другой использует -target. В чем разница между этими двумя?

Например, -source 1.5 и -target 1.6?

Кроме того, существует ли какой-либо случай, когда мы используем другой уровень совместимости с исходным и целевым уровнем?

4b9b3361

Ответ 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-совместимый байт-код. Но я не проверял, действительно ли это сделает компилятор. К сожалению, это практически не реализуется на практике.