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, а поле «цель»
— для указания совместимости с изменениями JVM.
Давайте теперь посмотрим на конфигурацию компилятора Maven для pom.xml:
<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 предоставляет две основные возможности:
- Генерация подписей среды выполнения Java
- Проверка проекта по подписям API
Давайте теперь изменим 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 .