Разница между компиляцией области maven и предоставленной для JAR-упаковки - PullRequest
235 голосов
/ 11 июля 2011

В чем разница между областью maven compile и provided, когда артефакт создается как JAR?Если бы это была WAR, я бы понял - артефакт будет включен или нет в WEB-INF / lib.Но в случае JAR это не имеет значения - зависимости не включены.Они должны быть на пути к классам, когда их область действия compile или provided.Я знаю, что provided зависимости не транзитивны - но это только одно различие?

Ответы [ 6 ]

265 голосов
/ 11 сентября 2014

Компиляция означает, что вам нужен JAR для компиляции и запуска приложения. Например, для веб-приложения JAR будет помещен в каталог WEB-INF / lib.

Предоставлено означает, что вам нужен JAR для компиляции, но во время выполнения уже существует JAR, предоставленный средой, поэтому вам не нужно, чтобы он был упакован вместе с вашим приложением. Для веб-приложения это означает, что файл JAR не будет помещен в каталог WEB-INF / lib.

Для веб-приложения, если сервер приложений уже предоставляет JAR (или его функциональные возможности), тогда используйте «предоставленный», в противном случае используйте «compile».

Вот ссылка.

263 голосов
/ 11 июля 2011

Из Maven Doc :

  • compile

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

  • при условии

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

Резюме:

  • зависимости не являются транзитивными (как вы
  • при условии, что область видимости доступна только для пути к классам компиляции и теста, тогда как область компиляции доступна для всех путей классов.
  • при условии, что зависимости не упакованы
17 голосов
/ 23 января 2017

Вот краткое описание всех поддерживаемых зависимостей (источник maven doc )

compile

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

при условии

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

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

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

test

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

system

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

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

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

16 голосов
/ 23 июля 2014

Если вы планируете сгенерировать один JAR-файл со всеми его зависимостями (типичный xxxx-all.jar), тогда предоставленная область имеет значение, потому что классы внутри этой области не будут упакованы в результирующий JAR.

См. Maven-assembly-plugin для получения дополнительной информации

9 голосов
/ 17 сентября 2015
  • компилировать

Сделайте доступным путь к классу, не добавляйте эту зависимость в последний jar, если это обычный jar; но добавьте этот jar в jar, если final jar - это один jar (например, исполняемый jar)

  • 1011 * при условии *

Зависимость будет доступна во время выполнения, поэтому ни в коем случае не добавляйте эту зависимость; даже не в одной банке (т.е. исполняемой банке и т. д.)

3 голосов
/ 11 июля 2016

Для файла jar разница заключается в пути к классам, указанному в файле MANIFEST.MF, включенном в jar, если для addClassPath задано значение true в конфигурации maven-jar-plugin. зависимости 'compile' появятся в манифесте, зависимости 'условии' не появятся.

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

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