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 .