Sobes.tech
Назад к вопросам
Junior — Middle
54

Каким образом можно определить в Maven, на каком этапе сборки подключаемая библиотека будет использоваться?

Компании, где спрашивали
Северсталь-ИфокомСеверсталь-Ифоком

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

В Maven момент, когда библиотека будет доступна, определяется через scope зависимости и lifecycle-фазы, на которых выполняются плагины. Чаще всего важно различать compile, test, runtime, provided и system. Также нужно понимать, что сама зависимость может быть доступна на разных этапах: компиляция, тесты, запуск приложения, упаковка.

Определение:

В Maven нельзя напрямую сказать, что библиотека будет использоваться на конкретной фазе сборки одной настройкой. Это определяется комбинацией scope у зависимости и тем, на какой фазе подключён плагин, который эту зависимость использует.

  • compile — доступна на компиляции, тестах и в рантайме по умолчанию.
  • test — нужна только для тестов.
  • runtime — не нужна при компиляции, но нужна при запуске.
  • provided — нужна для компиляции, но ожидается в окружении выполнения и не упаковывается.
  • system — подключается явно по пути к jar, используется редко.

Если речь именно о том, когда библиотека будет участвовать в сборке, то это обычно определяется фазой lifecycle, на которой запускается соответствующий плагин, например test, package, install.

Пример использования:

Например, библиотека для JUnit нужна только при запуске тестов, поэтому её объявляют со scope test. А JDBC-драйвер обычно нужен только во время выполнения приложения, поэтому его часто ставят как runtime.

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>5.10.0</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>2.2.224</version>
        <scope>runtime</scope>
    </dependency>
</dependencies>

Пояснение кода:

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

  1. junit-jupiter с scope test будет доступен только при выполнении тестовых фаз Maven.
  2. h2 с scope runtime не участвует в компиляции основного кода, но будет доступен при запуске приложения или тестов, если нужен на рантайме.
  3. Если бы библиотека была нужна прямо в коде приложения на этапе компиляции, scope был бы compile или вообще не указан, так как это значение по умолчанию.

Ключевые моменты:

  • scope у зависимости определяет, на каких этапах она доступна.
  • Фаза Maven lifecycle определяет, когда запускаются цели плагинов.
  • Для тестовых библиотек обычно используют test.
  • Для библиотек, нужных только при запуске, используют runtime.
  • provided подходит для зависимостей, которые даст контейнер или среда выполнения.
  • Если нужен ответ “на каком этапе будет использоваться библиотека”, стоит говорить и про scope, и про фазу сборки, потому что это разные, но связанные механизмы.