Різниця між компіляцією продуктового поля та передбаченою упаковкою JAR


260

Яка різниця між сферою Maven compileі providedколи артефакт будується як JAR? Якби це була ВІЙНА, я розумію - артефакт був би включений чи ні в WEB-INF / lib. Але у випадку JAR це не має значення - залежності не включаються. Вони повинні бути на шляху до класів , коли їх область compileабо provided. Я знаю, що providedзалежності не перехідні - але це лише одна різниця?

Відповіді:


289

З Документа Мавена :

  • складати

    Це область за замовчуванням, яка використовується, якщо жодна не вказана. Залежності компіляції доступні на всіх класах проекту. Крім того, ці залежності поширюються на залежні проекти.

  • за умови

    Це дуже схоже на компіляцію, але вказує на те, що ви очікуєте, що JDK або контейнер забезпечать залежність під час виконання. Наприклад, створюючи веб-додаток для Java Enterprise Edition, ви б встановили залежність від API сервлетів та відповідних API API EE Java, що надається, оскільки веб-контейнер забезпечує ці класи. Ця область доступна лише для компіляції та тестування, і не є перехідною.

Резюме:

  • залежності не є перехідними (як ви згадали)
  • наданий обсяг доступний лише на класах компіляції та тестування, тоді як область компіляції доступна на всіх класах.
  • за умови, що залежності не пакуються

5
Так, я знаю. Але я розмірковую над різницею областей у JAR packagingконтексті. Доктор Мейвен про це не згадує. Я деякий час використовую Maven, але я вже про це запитував себе :) Отже, схоже, що в JAR packagingконтексті немає різниці між compileі provided(крім переходу до залежності). Маю рацію?
емстол

3
@Jacob, що означає "тоді як область компіляції доступна на всіх класах ".
Geek

1
Я думаю, що "НЕ перехідний" - це найбільший улов. Тому що пекло залежностей - це те, з чим розробники стикаються дуже часто, і за умови, що сфера дії не дозволяє йому переходити і возитися з іншими версіями, має вирішальне значення.
Seetharamani Tmr

2
Я думаю, що різниця полягає у фазі упаковки. При компіляції він буде включати банку в остаточну війну або банку (наприклад, виконувану банку з весняним завантаженням), і за умови, що це може призвести до відсутності. Оскільки наданий jar може надаватися веб-контейнером (наприклад, поміщеним у папку ext lib), він не знаходиться у пакеті війни, якщо не залежатиме від інших областей, компіляції, виконання.
Аддо Чжан

1
@emstol Повертаючись до свого первинного запитання, ви праві, що у випадку JAR залежності не пакуються всередині самого JAR. Але в Maven упаковка JAR означає, що ви хочете використовувати її як бібліотеку. Як тільки ви імпортуєте його в якийсь інший проект Maven, перехідні залежності будуть виведені, якщо сфера є, compileа не буде, якщо область є provided.
LeoLuz

291

Компілювати означає, що вам потрібен JAR для компіляції та запуску програми. Як веб-додаток, наприклад, JAR буде розміщений у каталозі WEB-INF / lib.

За умови, що вам потрібен JAR для компіляції, але на час виконання вже існує JAR, що надається оточуючим середовищем, тому вам не потрібно його пакувати разом із додатком. Для веб-програми це означає, що файл JAR не буде розміщений у каталозі WEB-INF / lib.

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

Ось довідка.


11
Ви не відповідаєте на питання ОП? " Яка різниця у використанні компіляції масштабів Maven та наданні, коли артефакт будується як JAR ? «Зауважте, автор чітко заявляє, що вони знають різницю в упаковці як війні.
Альберто

Чи можу я використовувати надані, якщо я посилаюся на інший JAR, розгорнутий на тому ж сервері додатків ??
Самі Омар

1
Щоб було зрозуміло, надана залежність не додається до класного шляху при mvn exec:javaзапуску, а складена залежність є.
Джеймі

Я задав це запитання - stackoverflow.com/questions/37360132/… Проблему було вирішено шляхом зміни обсягу з наданого на компіляцію. Але я не бачу різниці між jar, зібраним із "наданим" обсягом, і jar, зібраним із "compile". Чи можете ви пояснити, чому?
Pavel_K

Прочитайте першу відповідь: coderanch.com/t/502091/tools/difference-maven-compile-scope
NINCOMPOOP

22

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

Для отримання додаткової інформації див. Плагін maven-Assembly-плагін


7
за умови залежності ==> залежність НЕ буде упакована.
Габ 是 好人

3
Плутанина в ОП чітко вирішується, коли ви пропонуєте пакет maven-assembly-plugin, що цікаво, що відповіді на найбільш голосові відповіді не згадують.
Анріке Г. Абреу

Я не розумію цієї відповіді. Це більше схоже на коментар.
reinierpost

11
  • складати

Зробити доступним для шляху до класу, не додавати цю залежність у остаточну банку, якщо вона є звичайною; але додайте цю банку в банку, якщо остаточна банка є однією банку (наприклад, виконувана банка)

  • за умови

Залежність буде доступна в умовах виконання часу, тому не додайте цю залежність ні в якому разі; навіть не в одній банці (тобто виконується банка тощо)


3

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

Одне з моїх вихованців - це те, що ці два слова повинні мати однаковий час. Або складені та надані, або складені та надані.


0

Якщо ви встановите область maven як provided, це означає, що при запуску плагіна фактична використовувана версія залежностей буде залежати від встановленої вами версії Apache Maven.


0

Якщо jar файл схожий на виконуваний файл весняного завантажувального файлу, то обсяг усіх залежностей повинен compileмістити всі файли jar.

Але якщо файл jar використовується в інших пакетах чи програмах, то він не повинен включати всі залежності в jar-файл, оскільки ці пакети чи програми можуть самі забезпечувати інші залежності.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.