Sobes.tech
Назад к вопросам
Middle+
5

Понимаешь жизненный цикл Maven и скопы зависимостей? Что такое scope? Почему servlet-api ставят как provided?

Компании, где спрашивали
pdm

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

sobes.tech AI

В Maven жизненный цикл (lifecycle) — это последовательность фаз, которые выполняются для сборки проекта, например: validate, compile, test, package, install, deploy.

Scope (область видимости) зависимости определяет, на каких этапах сборки и выполнения она доступна:

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

Почему servlet-api ставят как provided?

Потому что контейнер сервлетов (например, Tomcat, Jetty) уже содержит эту библиотеку. Если включить её в артефакт, может возникнуть конфликт версий или дублирование. Поэтому servlet-api указывается с provided, чтобы использовать её при компиляции, но не включать в итоговый WAR/JAR.

Пример в pom.xml:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>