«1. Введение

При работе на Java бывают случаи, когда нам нужно использовать несколько языковых версий одновременно.

Обычно требуется, чтобы наша Java-программа была совместима во время компиляции с одной версией Java (скажем, Java 6), но при этом необходимо использовать другую версию (скажем, Java 8) в наших инструментах разработки и возможно, другая версия для запуска приложения.

В этой быстрой статье мы покажем, как легко добавить средства защиты от несовместимости на основе версии Java и как плагин Animal Sniffer можно использовать для отметки этих проблем во время сборки путем проверки нашего проекта на наличие ранее созданных сигнатур.

2. Установка -source и -target для компилятора Java

Давайте начнем с проекта hello world Maven, где мы используем Java 7 на нашем локальном компьютере, но мы хотели бы развернуть проект на производственная среда, которая все еще использует Java 6.

В этом случае мы можем настроить подключаемый модуль компилятора Maven с исходными и целевыми полями, указывающими на Java 6.

Поле «источник» используется для указания совместимости с Java языковые изменения, а поле «target» используется для указания совместимости с изменениями JVM.

Давайте теперь посмотрим на конфигурацию pom.xml компилятора Maven:

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.7.0</version>
	<configuration>
            <source>1.6</source>
            <target>1.6</target>
	</configuration>
    </plugin>
</plugins>

С Java 7 на нашей локальной машине и кодом Java, выводящим «hello world» на консоль, если мы продолжим и создадим этот проект, используя Maven, он будет корректно собираться и работать на рабочей машине с Java 6.

3. Введение несовместимости API

Давайте теперь посмотрим, как легко случайно ввести несовместимость API.

Допустим, мы начинаем работать над каким-то новым требованием и используем некоторые функции API Java 7, которых не было в Java 6.

Давайте посмотрим на обновленный исходный код:

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

java.nio. charset.StandardCharsets был представлен в Java 7.

Если мы сейчас продолжим и выполним сборку Maven, она все равно будет успешно скомпилирована, но во время выполнения произойдет сбой с ошибкой компоновки на рабочей машине с установленной Java 6.

В документации Maven упоминается этот подводный камень и в качестве одного из вариантов рекомендуется использовать плагин Animal Sniffer.

4. Совместимость API отчетов

Плагин Animal Sniffer предоставляет две основные возможности:

  1. Generating signatures of the Java runtime
  2. Checking a project against API signatures

Давайте теперь изменим pom.xml, чтобы включить плагин:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>animal-sniffer-maven-plugin</artifactId>
    <version>1.16</version>
    <configuration>
        <signature>
            <groupId>org.codehaus.mojo.signature</groupId>
            <artifactId>java16</artifactId>
            <version>1.0</version>
        </signature>
    </configuration>
    <executions>
        <execution>
            <id>animal-sniffer</id>
            <phase>verify</phase>
            <goals>
                <goal>check</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Здесь раздел конфигурации Animal Sniffer относится к существующая подпись среды выполнения Java 6. Кроме того, секция выполнения проверяет и сверяет исходный код проекта с заданной подписью и помечает, если обнаружены какие-либо проблемы.

Если мы продолжим сборку проекта Maven, сборка завершится ошибкой, и плагин сообщит об ошибке проверки подписи, как и ожидалось:

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.codehaus.mojo:animal-sniffer-maven-plugin:1.16:check 
(animal-sniffer) on project example-animal-sniffer-mvn-plugin: Signature errors found.
Verify them and ignore them with the proper annotation if needed.

5. Заключение

В этом руководстве мы рассмотрели плагин Maven Animal Sniffer. и как его можно использовать для сообщения о несовместимостях, связанных с API, если таковые имеются, во время сборки.

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