Как настроить Maven для работы без подключения к интернету (offline mode)?

«Как настроить Maven для работы без подключения к интернету (offline mode)?» — вопрос из категории CI/CD, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для сборки в изолированных или высокозащищенных средах мы настраивали полностью оффлайн-работу Maven. Вот практический подход:

1. Подготовка локального репозитория: Сначала на машине с доступом в интернет нужно заполнить локальный кэш (~/.m2/repository) всеми необходимыми зависимостями.

# Скачивает все зависимости и плагины проекта
mvn dependency:go-offline

# Дополнительно: для многомодульных проектов лучше выполнить полную сборку
mvn clean compile dependency:go-offline

После этого всю папку .m2/repository можно архивировать и перенести в изолированную среду.

2. Использование локального прокси-репозитория (рекомендуемый способ): Мы разворачивали Nexus Repository Manager в изолированном контуре.

  • Настраивали репозитории maven-central (proxy), releases (hosted), snapshots (hosted).
  • На машине-доноре выполняли синхронизацию, чтобы Nexus закешировал все артефакты.
  • В изолированной среде разработчики и CI-сервер настраивали settings.xml на использование только этого Nexus.

Пример settings.xml для оффлайн-работы через Nexus:

<settings>
  <mirrors>
    <mirror>
      <id>nexus</id>
      <name>Corporate Nexus</name>
      <url>http://internal-nexus:8081/repository/maven-group/</url>
      <mirrorOf>*</mirrorOf> <!-- Все запросы идут в наш Nexus -->
    </mirror>
  </mirrors>
</settings>

3. Запуск сборки в оффлайн-режиме: В CI-скрипте или при локальной сборке используется флаг -o (или --offline).

mvn -o clean package

Maven будет искать зависимости только в локальном репозитории (кэше или Nexus) и не станет пытаться выйти в интернет.

4. Критически важные моменты из практики:

  • Плагины: Команда dependency:go-offline не всегда скачивает все плагины. Нужно убедиться, что в pom.xml у всех плагинов указаны конкретные версии, и провести пробную оффлайн-сборку для их кэширования.
  • Локальная установка артефактов: Для внутренних библиотек, которых нет в публичных репозиториях, использовали mvn install для их размещения в локальном .m2 перед переходом в оффлайн.
  • Идемпотентность: Конфигурация settings.xml и набор зависимостей должны быть одинаковыми на всех машинах, чтобы избежать проблем с checksum.