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

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

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

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

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

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

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

2 ответа

Решение

Вы ошибаетесь / неоднозначно provided, Это означает: "Этот jar-файл должен быть скомпилирован локально, но он будет предоставлен в classpath чем-то другим во время выполнения, поэтому не включайте его в classpath для меня". Например, все веб-контейнеры (например, tomcat) содержат файлы jar для сервлетов. Вы должны использовать 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> раздел."Кто-то поправит меня, если я ошибаюсь.

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

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

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

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

  • компилировать:

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

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

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

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

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

  • тест:

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

  • система:

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

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

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

Другие вопросы по тегам