В настоящее время мы используем 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.