Перейти к основному содержимому

Gradle: исходная совместимость и целевая совместимость

· 3 мин. чтения

1. Обзор

В этой статье мы рассмотрим разницу между конфигурациями Java sourceCompatbility и targetCompatibility , а также их использование в Gradle.

Вы можете прочитать нашу статью « Введение в Gradle », чтобы узнать больше об основах.

2. Обработка версий в Java

Когда мы компилируем Java-программу с помощью javac , мы можем предоставить параметры компиляции для обработки версий. Доступны два варианта:

  • -source со значениями, соответствующими версиям Java, вплоть до JDK, который мы используем для компиляции (например, 1.8 для JDK8). Предоставляемое нами значение версии ограничивает функции языка, которые мы можем использовать в нашем исходном коде, соответствующей версией Java.
  • -target аналогичен, но управляет версией сгенерированных файлов классов. Это означает, что значение версии, которое мы предоставляем, будет самой низкой версией Java, на которой может работать наша программа .

Например:

javac HelloWorld.java -source 1.6 -target 1.8

Это создаст файл класса, для запуска которого требуется Java 8 или выше . Кроме того, исходный код не может содержать лямбда-выражения или какие-либо функции, недоступные в Java 6 .

3. Обработка версий с помощью Gradle

Gradle вместе с подключаемым модулем Java позволяет нам установить параметры источника и цели с помощью конфигураций sourceCompatibility и targetCompatibility задачи java . Точно так же мы используем те же значения, что и для javac .

Настроим файл build.gradle :

plugins {
id 'java'
}

group 'com.foreach'

java {
sourceCompatibility = "1.6"
targetCompatibility = "1.8"
}

4. Пример компиляции HelloWorldApp

Мы можем создать Hello World! консольное приложение и продемонстрируйте функциональность, создав его с помощью приведенного выше сценария.

Давайте создадим очень простой класс:

public class HelloWorldApp {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}

Когда мы создадим его с помощью команды сборки gradle , Gradle сгенерирует файл класса с именем HelloWorldApp.class .

Мы можем использовать инструмент командной строки javap , который упакован с Java, чтобы проверить сгенерированную версию байт-кода этого файла класса:

javap -verbose HelloWorldApp.class

Это выводит много информации, но в первых нескольких строках мы видим:

public class com.foreach.helloworld.HelloWorldApp
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER

Поле основной версии имеет значение 52, которое является номером версии для файлов классов Java 8. Это означает, что наш HelloWorldApp.class может работать только с использованием Java 8 и выше .

Чтобы протестировать конфигурацию sourceCompatibility , мы можем изменить исходный код и добавить функцию, недоступную в Java 6.

Используем лямбда-выражение:

public class HelloWorldApp {

public static void main(String[] args) {
Runnable helloLambda = () -> {
System.out.println("Hello World!");
}
helloLambda.run();
}

}

Если мы попытаемся собрать наш код с помощью Gradle, мы увидим ошибку компиляции:

error: lambda expressions are not supported in -source 1.6

Параметр -source , который является Java-эквивалентом конфигурации sourceCompatibility Gradle, предотвращает компиляцию нашего кода. По сути, это защищает нас от ошибочного использования функций более высоких версий, если мы не хотим их вводить — например, мы можем захотеть, чтобы наше приложение могло работать и в средах выполнения Java 6.

5. Вывод

В этой статье мы объяснили, как использовать параметры компиляции -source и -target для обработки версий нашего исходного кода Java и целевой среды выполнения. Кроме того, мы узнали, как эти параметры сопоставляются с конфигурациями исходной совместимости и целевой совместимости Gradle с подключаемым модулем Java , и продемонстрировали их функциональность на практике.

Как всегда, исходный код этой статьи доступен на GitHub .