Лучшие методы управления зависимостями Java

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

Зависимости занимают около 80-90 процентов бинарного файла — поэтому при создании Java-проекта о них следует позаботиться. В этой статье я дам вам несколько советов и лучших практик по работе с Java-зависимостями в вашем проекте.

  • Почему нужно быть более осведомленным о зависимостях Java
  • Управление зависимостями Java
  • Включение зависимостей в ваши Java-проекты
  • Обновление зависимостей Java
  • Удаление зависимостей Java из вашего проекта

Почему стоит быть более осведомленным о зависимостях Java

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

Однако то, как мы относимся к зависимостям, сильно отличается от того, как мы относимся к собственному коду. Во многих случаях зависимости используются без какой-либо формы проверки. И во многих случаях эти зависимости верхнего уровня влекут за собой переходные зависимости, которые могут уходить на несколько уровней вглубь. Например, приложение Spring на 200 строк с пятью прямыми зависимостями может в итоге использовать 60 зависимостей в общей сложности, что составляет почти полмиллиона строк кода, отправленного в производство.

Обновление Java-зависимостей в старых проектах может быть сложной задачей. Если они устарели, вы получите эффект домино с проблемами совместимости, а обновление одной библиотеки может означать обновление нескольких из-за ошибки или проблемы безопасности. Если эти Java-зависимости изменят свой API, вам придется полностью переписать свое приложение.

Кроме того, во многих крупных корпоративных приложениях зависимости остаются в файле манифеста, даже если они больше не используются в коде. Эти неиспользуемые зависимости все еще доступны в вашей программе.

Все это может привести к:

  • Большим двоичным файлам, которые используют больше ресурсов или времени запуска
  • Возможные коллизии в библиотеках при добавлении новых зависимостей.
  • Устаревшие библиотеки, содержащие ошибки или проблемы безопасности
  • Проблемы совместимости при обновлении библиотек
  • И многое другое

Управление зависимостями Java

Одна из лучших практик для значительного использования репозиториев, таких как Maven Central, — это установка собственного менеджера репозиториев. Это выделенный прокси-сервер между вашей внутренней разработкой и публичными репозиториями, который не только обеспечит вам более быстрые и стабильные сборки, но и позволит вам установить политики для Java-пакетов. Например, вы можете заблокировать определенные версии, чтобы они не могли быть загружены и использованы в ваших приложениях.

Более подробную информацию о менеджерах репозиториев и список возможных продуктов можно найти в документации по Maven.

Включение новых зависимостей в ваш Java-проект

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

Решит ли это проблему?

Основная причина импорта пакета — это решение вашей проблемы. Вопрос в том, может ли выбранная вами зависимость сделать это. Кроме того, решает ли она проблему в целом, не создавая новых проблем? Если это не так, возможно, существуют лучшие решения.

Нужен ли мне (весь) пакет?

Стоит ли импортировать большую зависимость с множеством функций и типов данных, если вам нужна только одна функция? Иногда может быть проще и удобнее написать эту функцию самому. Например, имеет ли смысл включать весь пакет Eclipse Collections, если я хочу использовать только тип данных Tuple? Скорее всего, нет.

Быстрый взгляд на mvnrepository.com показывает, что этот пакет занимает около 10 МБ.

Кроме того, проверьте, могут ли уже имеющиеся у вас зависимости выполнить эту работу за вас. Возможно, некоторые похожие функции или типы данных уже доступны. С другой стороны, включение новой, обширной библиотеки может помочь вам решить сразу несколько проблем — все зависит от ситуации.

Сколько у нас вкладчиков?

Если используемая вами зависимость Java имеет только одного или всего несколько сопровождающих, то мы имеем довольно низкий коэффициент загруженности. Что произойдет, если сопровождающий решит уволиться или у него не будет времени на исправление ошибки? В качестве альтернативы вы можете и сами внести свой вклад в проект — это сделает его более безопасным для всех участников.

Но прежде чем включать какие-либо зависимости в свой проект, обязательно проверьте репозиторий ядра и посмотрите, сколько там активных сопровождающих.

Поддерживается ли он до сих пор?

Если пакет больше не поддерживается, вам определенно не стоит полагаться на него. Прежде чем интегрировать пакет, проверьте, есть ли новые обновления в репозитории GitHub, и посмотрите на цикл выпуска пакета. Это даст вам представление о том, насколько хорошо поддерживается пакет.

Какова последняя версия пакета?

Примеры кода могут дать вам отличное представление о конкретной зависимости Java. Однако эти примеры могут быть устаревшими, а предполагаемый пакет может быть уже обновлен. Рассмотрите возможность использования последней стабильной версии. Для Eclipse Collections мы видим, что последний стабильный выпуск — 11.1.0 от 5 июля 2022 года на сайте mvnpackage.com. Рассмотрите возможность использования этой версии.

Обратите внимание, что версия 11.1.0.M2 также указана на этом изображении. Это явно предварительная версия. Вы должны включать стабильные релизные версии в свое производственное приложение только в том случае, если вы абсолютно уверены. Как правило, не включайте версии, которые имеют квалификатор, например:

  • альфа или a
  • бета или b
  • milestone или m
  • rc или cr
  • snapshot

Если зависимость Java имеет квалификатор GA или final, вы можете считать ее стабильной версией.

Есть ли уязвимости безопасности?

Прежде чем активно использовать Java-пакет, убедитесь, что вы проверили его на наличие известных уязвимостей. Snyk CLI — отличный инструмент для сканирования файла Maven или Gradle. Если библиотека содержит уязвимость в безопасности, возможно, вам стоит выбрать другой пакет для зависимости.

Обновите зависимости Java

Доступны ли более новые версии?

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

Имейте в виду, что ваши инструменты могут указывать вам на бета-версии или предварительные версии. Настоятельно рекомендуется использовать только стабильные версии библиотек.

Пример Maven

В Maven вы можете использовать плагин версий, как показано ниже. Нет необходимости вводить что-то конкретное в ваш pom.xml

mvn versions:display-dependency-updates
Вход в полноэкранный режим Выйти из полноэкранного режима

Пример Gradle

Для Gradle мы должны включить плагин, подобный плагину versions от ben-manes.

plugins {
  id "com.github.ben-manes.versions" version "0.42.0"
}
Войти в полноэкранный режим Выйти из полноэкранного режима

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

gradle dependencyUpdates -Drevision=release
Войти в полноэкранный режим Выйти из полноэкранного режима

IntelliJ IDEA

Если вы используете IntelliJ IDEA, то в новых версиях будут подчеркнуты зависимости, которые можно обновить. Это работает как для проектов Maven, так и для проектов Gradle.

Snyk

При подключении вашего репозитория GitHub к учетной записи Snyk мы можем предоставлять вам рекомендуемые исправления или обновления при каждом запросе на исправление. Это, в дополнение к нашим исчерпывающим рекомендациям по безопасности, поможет вам поддерживать ваши Java-зависимости в актуальном состоянии.

Поддерживаются ли используемые вами пакеты?

Будет разумно просмотреть репозиторий GitHub или mvnpackage.com, чтобы убедиться в наличии последних обновлений и фиксаций. Если кажется, что пакет больше не поддерживается, вы можете поддерживать его самостоятельно или перейти на другую, более обновленную библиотеку.

Однако если вы столкнулись с проблемой, связанной с зависимостью, критически важной для вашего приложения, подумайте о том, чтобы устранить проблему самостоятельно и внести исправление в проект с открытым исходным кодом. Это будет высоко оценено — и зачастую быстрее, чем отправлять отчеты о проблемах и добиваться от сопровождающего устранения проблемы.

Есть ли проблемы с безопасностью в моих Java-зависимостях?

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

Snyk предоставляет вам несколько способов интегрировать сканирование зависимостей в жизненный цикл разработки. На локальной машине вы можете использовать Snyk CLI или интеграции для IntelliJ, Eclipse или VS Code для сканирования на наличие уязвимостей. Вы также можете сканировать во время цикла сборки с помощью плагина для Maven и Gradle (неофициального) или выбрать одну из интеграций CI pipeline. Кроме того, вы можете добавить свой Git-репозиторий в Snyk, чтобы мы могли ежедневно сканировать и обновлять ваши проекты.

Удаление зависимостей Java из вашего проекта

Используется ли пакет до сих пор?

Если Java-зависимость больше не используется, мы должны удалить ее из нашего файла манифеста. Каждый пакет в этом файле является частью вашего бинарного файла и доступен в classpath. Удаление неиспользуемых зависимостей сделает ваш двоичный файл меньше — и приведет к ускорению запуска и загрузки, а также к повышению безопасности. Минимизация зависимостей в вашем classpath имеет решающее значение для защиты от атак типа цепочки гаджетов десериализации.

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

Пример Maven

Для Maven я могу использовать плагинdependency для анализа моих зависимостей. Этот плагин проверяет, используются ли в моем коде те Java-зависимости, которые я объявляю.

В данном случае я не хочу, чтобы меня беспокоили предоставленные или тестовые зависимости, поэтому я использую флаг ignoreNonCompile.

mvn dependency:analyze -DignoreNonCompile
Вход в полноэкранный режим Выход из полноэкранного режима

Пример Gradle

В Gradle нам нужно добавить еще один плагин для анализа зависимостей. В данном случае мы будем использовать плагин nebula.lint. Этот Gradle-линтер может проанализировать включенные вами зависимости java и проверить, нет ли неиспользуемых зависимостей.

plugins {
   id "nebula.lint" version "17.7.0"
}
Вход в полноэкранный режим Выход из полноэкранного режима

Мне нужно настроить плагин соответствующим образом, чтобы установить gradleLint.rules. Вы можете сделать это в вашем файле Gradle или как параметр командной строки. В примере ниже я выбрал последний вариант. Проверьте документацию плагина для получения дополнительной информации о том, как настроить этот плагин для вашего приложения.

gradle lintGradle -PgradleLint.rules=unused-dependency
Войти в полноэкранный режим Выход из полноэкранного режима

Создание надежной стратегии управления зависимостями для ваших Java-приложений

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

Ознакомьтесь с этой статьей, чтобы узнать больше об управлении зависимостями с открытым исходным кодом.

Защитите свои зависимости бесплатно

Создайте учетную запись Snyk сегодня, чтобы легко сканировать и защищать зависимости.

Зарегистрируйтесь бесплатно

Оцените статью
devanswers.ru
Добавить комментарий