Разница между объемом maven и компиляцией JAR

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

Ответ 1

Из Maven Doc:

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

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

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

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

Резюме:

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

Ответ 2

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

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

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

Вот ссылка.

Ответ 3

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

компиляции

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

при условии,

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

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

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

тест

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

система

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

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

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

Ответ 4

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

Подробнее см. maven-assembly-plugin

Ответ 5

  • компиляции

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

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

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

Ответ 6

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

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