Gradle, "sourceCompatibility" и "targetCompatibility"?

Какова связь/разница между sourceCompatibility и targetCompatibility? Что происходит, когда они установлены на разные значения?

Согласно Gradle документация:

sourceCompatibility - это "совместимость версии Java для компиляции Java-источника". targetCompatibility - это "Java-версия для генерации классов для".

Я понимаю, что targetCompatibility будет генерировать java-байт-код, совместимый с определенной версией Java, является ли это подмножеством функций sourceCompatibility?

Ответ 1

это сопоставляется с javac - см. раздел кросс-компиляции - источник в основном является уровнем исходного языка, а целью является уровень байт-кода, который.

Ответ 2

Будьте осторожны, когда вы их используете; нас укусили люди, делающие предположения.

Просто потому, что вы используете sourceCompability (или targetCompatibility) 1.5, не означает, что вы всегда можете скомпилировать свой код с JDK 1.6 и ожидать, что он будет работать под JDK 1.5. Проблема заключается в доступных библиотеках.

Если ваш код вызывает вызов некоторого метода, который доступен только в JDK 1.6, он все равно будет компилироваться с различными параметрами совместимости для целевой виртуальной машины. Но когда вы запустите его, он будет терпеть неудачу, потому что метод нарушения отсутствует (вы получите исключение MethodNotFoundException или ClassNotFoundException).

По этой причине я всегда сравниваю параметр Compatibility с фактической версией Java, на которой я строю. Если они не совпадают, я не могу выполнить сборку.

Ответ 3

sourceCompatibility= указывает, что версия языка программирования Java используется для компиляции файлов .java. Например, sourceCompatibility 1.6 = указывает, что версия 1.6 языка программирования Java используется для компиляции файлов .java.

По умолчанию sourceCompatibility = "версия текущей JVM в использовании" и targetCompatibility = sourceCompatibility

targetCompatibility= опция гарантирует, что созданные файлы классов будут совместимы с виртуальными машинами, указанными targetCompatibility. Обратите внимание, что в большинстве случаев значением параметра -target является значение опции -source; в этом случае вы можете опустить параметр -target.

Файлы классов будут запускаться на целевом объекте, указанном targetCompatibility и в более поздних версиях, но не на более ранних версиях VM