Есть ли способ связать несовместимые ссылки Java API с PMD, Checkstyle, SpotBugs и т. Д.? - PullRequest
8 голосов
/ 10 июня 2019

В настоящее время мы используем Java Compiler 11 и разворачиваем наши основные артефакты на Java 11. Здесь нет проблем.

К сожалению, используемый нами сервис поддерживает только Java 8, поэтому мы компилируем некоторые из них, ориентированные на Java 8. Здесь нет проблем.

Наша проблема в том, что разработчики могут ссылаться на методы, которые недоступны во время выполненияв Java 8. Например, List.of(), Optional::stream и т. д. javac версия 11 скомпилирует его в Java 8, но при выполнении в JVM версии 8 будет сгенерировано исключение.

Последнее легкоэтого достаточно для идентификации с помощью простого выражения grep, но последнее сложнее и требует понимания кода / AST.

Я проверил документы на наличие Checkstyle, Spotbugs и PMD, но безуспешно.IntelliJ на самом деле очень хорош в этом, но он не может быть интегрирован в наш конвейер CI.

И мы получили это наивное / упрощенное выражение grep:

grep --recursive --extended-regexp '[ \(](List|Set|Map).of' 'our_project'

Мы хотели бы получить точныйспособ определения несовместимого API.

1 Ответ

1 голос
/ 11 июня 2019

До Java 9 вам нужно будет использовать либо Animal Sniffer Plugin , либо настроить правильный -bootclasspath для javac (в разделе Параметры кросс-компиляции на javac ) вдоль с опцией -target или просто используйте ту же версию JDK.

Начиная с Java 9, появилась новая опция командной строки, которая решает эту проблему: --release. Просто используйте, например, --release 8 для компиляции для Java8, и javac должен завершиться с ошибкой компиляции, если вы используете какой-либо API, который доступен только в более поздней версии.

...