Как вы заметили, две конфигурации совместимости не учитывают API более старых версий - только синтаксис, семантику и полученный байт-код.
Существует два варианта, которые вы можете выбрать. Один из них - установить на компьютер JDK 8 и настроить Gradle для его использования при компиляции проекта. Выглядит это так:
tasks.withType(JavaCompile) {
options.fork = true
options.forkOptions.executable = "$java8Home/bin/javac"
options.bootstrapClasspath = files("$java8Home/jre/lib/rt.jar")
}
Недостатком здесь является то, что вам сначала потребуется установить JDK 8, и, поскольку он, вероятно, будет установлен в разных местах, вам, вероятно, потребуется настроитьэто с переменной или свойством среды (я назвал это java8Home
здесь).
Однако, начиная с Java 9, JDK теперь знает о документированных API предыдущих версий, и вы можете выбрать, какой из нихиспользовать с новым флагом --release
. Это не сработает, если вы используете недокументированные API, но это означает, что вы можете скомпилировать свой проект с любыми версиями Java и при этом сделать полученные классы совместимыми с Java 8. Вы можете сделать это следующим образом:
tasks.withType(JavaCompile) {
if (JavaVersion.current() > JavaVersion.VERSION_1_8) {
options.compilerArgs.addAll(['--release', '8'])
}
}
Обратите внимание, что оператор if существует только в том случае, если вам все еще нужно поддерживать запуск Gradle с Java 8 (через переменную JAVA_HOME
). Если вы используете только более поздние версии, его можно удалить, поэтому вы всегда должны устанавливать 'compilerArgs'.