«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 предоставляет две основные возможности:
- Generating signatures of the Java runtime
- 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.