Подтвердить что ты не робот

Какая разница между этими областями зависимости Maven: предоставлено/compile/system/import

Я прочитал документацию и понимаю.

Пожалуйста, исправьте или сообщите мне об истине; согласно моему пониманию:

  • provided
    Зависимости должны быть на машине, на которой вы запускаете код, и должны быть включены в путь

  • compile
    Зависимости не будут находиться на машине, которая запускает код, поэтому включите их в сборку

  • system
    Точно так же, как и при условии, но вам нужно, чтобы зависимости присутствовали в файле jar строго

  • import
    Похоже, что он должен импортировать зависимости из какого-либо другого POM файла, но я не знаю, как/почему, поэтому будет немного оценена

4b9b3361

Ответ 1

Вы ошибаетесь/неоднозначны относительно provided. Это означает: "Эта банка должна быть скомпилирована на локальном уровне, но она будет предоставлена ​​на пути к классу чем-то другим во время выполнения, поэтому не включайте ее в путь класса для меня". Например, все веб-контейнеры (например, tomcat) включают банки для сервлетов. Вы должны использовать provided для классов сервлетов, чтобы вы могли компилировать свой код локально, но вы не хотите переопределять классы сервлета, которые tomcat предоставляет вам при развертывании на нем.


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

Разницу между provided легче показать:

<dependency>
  <groupId>javax.sql</groupId>
  <artifactId>jdbc-stdext</artifactId>
  <version>2.0</version>
  <scope>system</scope>
  <systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>

Посмотрите, как у этого есть <systemPath>? Это различие. Вы не указываете путь с помощью provided, при условии, что он знает, как получить зависимость от репозитория. system получает его только из вашей файловой системы.


Я даже не слышал о import. @JigarJoshi связан с http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html, в котором говорится

импорт (доступен только в Maven 2.0.9 или новее)

Эта область используется только для зависимости типа pom в разделе <dependencyManagement>. Он указывает, что указанный POM должен быть заменен зависимостями в этом разделе POM. Поскольку они заменяются, зависимости с областью импорта фактически не участвуют в ограничении транзитивности зависимости.

Я думаю, что это говорит: "Возьмите все зависимости этого проекта и включите их в этом разделе <dependencyManagement>". Кто-то исправит меня, если я ошибаюсь.

Ответ 2

Пожалуйста, найдите точное значение областей в Maven

Я ссылался на Maven http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

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

Доступно 6 областей:

  • компиляции

    Это область по умолчанию, которая используется, если ни один не указан. Зависимости компиляции доступны во всех классах проекта. Кроме того, эти зависимости распространяются на зависимые проекты.

  • при условии,:

    Это похоже на компиляцию, но указывает, что вы ожидаете, что JDK или контейнер предоставят зависимость во время выполнения. Например, при создании веб-приложения для Java Enterprise Edition вы должны установить зависимость от API-интерфейса Servlet и связанных с ним API-интерфейсов Java EE для области видимости, поскольку веб-контейнер предоставляет эти классы. Эта область видимости доступна только в пути к компиляции и тестированию и не является транзитивной.

  • во время выполнения

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

  • тест

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

  • система

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

  • импорт (доступен только в Maven 2.0.9 или новее):

    Эта область используется только для зависимости типа pom в этом разделе. Он указывает, что указанный POM должен быть заменен зависимостями в этом разделе POM. Поскольку они заменяются, зависимости с областью импорта фактически не участвуют в ограничении транзитивности зависимости.