Яка різниця у Maven між залежностями та тегами плагінів у pom xml?


118

Я новачок у інструменті maven, я створив проект із Spring і Hibernate, і вони налаштовані в pom.xml як плагіни, але JUnit позначений залежно від залежності. Моє запитання: яка логіка, що стоїть за одним як плагіном, а одним як залежністю?

Відповіді:


213

І плагіни, і залежності - це файли Jar.

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

Наприклад, ви використовуєте компілятор-плагін для компіляції файлів Java. Ви не можете використовувати компілятор-плагін як залежність, оскільки це додасть лише плагін до classpath і не запустить жодної компіляції. Файли Jar, які будуть додані до класного шляху при компілюванні файлу, будуть вказані як залежність.

Те саме стосується вашого сценарію. Ви повинні використовувати spring-плагін для виконання деяких весняних виконуваних файлів [я не впевнений, для чого використовуються весняні плагіни. Я просто тут здогадуюсь]. Але вам потрібні залежності для виконання цих виконуваних файлів. І Junit позначений тегом під залежністю, оскільки він використовується плагін-верифікатором для виконання одиничних тестів.

Отже, можна сказати, плагін - це файл Jar, який виконує завдання, а залежність - Jar, який забезпечує файли класу для виконання завдання.

Сподіваємось, що відповість на ваше запитання!


Чи можу я хтось сказати, чим відрізняється фаза від мети у виконанні ?? Як я знав, фаза говорить про життєвий цикл Maven .. але навіщо цілі знову? якісь підказки? Іноді я бачу, як люди ставлять за мету ключове слово життєвого циклу ... ??? (?.?)
taymedee

@taymedee це питання SO описує різницю: stackoverflow.com/questions/16205778 / ...
dev_feed

1
@ r981 Ваша відповідь має бути більш зрозумілою. Ця відповідь краще: stackoverflow.com/questions/26292073/…
Digital Impermanence

Я думаю, що пропущений момент цієї відповіді полягає в тому, що: залежності вищого рівня в основному використовуються вашим артефактом замість плагінів.
lfree

3
@MichaelPacheco, Що я мав на увазі, весна-плагін виконає певну задачу виконання набору коду, який може залежати від деяких бібліотек, який буде визначений "залежностями". Візьміть інший приклад: вам потрібен компілятор для виконання фрагмента коду; Тут ваш компілятор - плагін, а ваш код - виконуваний файл. Тільки ваш компілятор здатний виконувати будь-який код, але ваш код може залежати від бібліотеки, скажімо, апарат apache commons, який буде залежністю. Ваш компілятор може компілювати код лише тоді, коли залежності є в класі. Я сподіваюся, що це зараз зрозуміло.
r9891

37

Сам Мейвен можна описати як кухонний комбайн, який має багато різних підрозділів, які можна використовувати для виконання різних завдань. Ці одиниці називаються плагінами. Наприклад, для складання ваших проектів Maven maven-compiler-plugin, проведення тестів - maven-surefire-pluginі так далі.

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


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

Так, і наскільки я знаю, немає такого поняття, як плагін Spring Maven. Зазвичай Spring libs (або Hibernate, або JUnit, або TestNG тощо) оголошуються залежностями для вашого проекту. Якщо ви новачок у Maven, я б рекомендував прочитати цю дуже хорошу книгу.
Андрій Логвінов

@AndrewLogvinov - У мене є багатопомісний проект для тестування автоматизації api. Один з проектів Maven має тести автоматизації. Розділ побудови проекту pom мав лише 1 плагін - maven surefire плагін із посиланням на набір. Весь тег збірки видалено. Скажіть, будь ласка, що це означає? Дякую.
MasterJoe

15

Плагіни та залежності - це дуже різні речі, і вони доповнюють один одного.

Що таке плагіни?

Плагіни виконують завдання для збірки Maven. Вони не вкладаються у додаток.

Це серце Мейвена.
Будь-яке завдання, виконане Maven, виконується плагінами .
Є дві категорії плагінів: і плагіни :buildreporting

  • Під час збірки будуть виконані плагіни збирання, і вони повинні бути налаштовані в <build/>елементі з POM.
  • Плагіни звітування будуть виконуватися під час генерації сайту, і вони повинні бути налаштовані в <reporting/елементі> з POM.

Відповідно до головної мети, зазначеної в командному рядку (наприклад mvn clean, mvn clean packageабо mvn site), буде використано певний життєвий цикл і буде виконано певний набір цілей плагінів.
Є три вбудованих збірки: життєвий цикл default, cleanі site. defaultЖиттєвий цикл обробляє розгортання проекту, в cleanпротягом життєвого циклу проекту ручки очищення, в той час siteжиттєвого циклу управляє створенням документації сайту вашого проекту.

Мета плагіна може бути пов'язана з певною фазою конкретного життєвого циклу.
Наприклад, maven-compiler-pluginзв'язується за замовчуванням compileмета на стадії життєвого циклу: compile.
Більшість плагінів Maven (як основні, так і сторонні додатки) підтримують конвенцію щодо конфігурації. Таким чином, вони, як правило, прив'язують мету плагіна до певної фази, щоб зробити їх використання простішим.

Це акуратніше і менш схильні до помилок:

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.7.0</version>
</plugin>

ніж:

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.7.0</version>
  <executions>
    <execution>
        <phase>compile</phase>
        <goals>
            <goal>compile</goal>
        </goals>
    </execution>
  </executions>
</plugin>

Що таке залежності?

Залежності - це артефакти / компоненти Maven, необхідні на класному шляху під час збирання Maven.
Вони можуть бути упаковані у програмі, але не обов'язково (див. scopeНижче).

Більшість залежностей є jar, але це можуть бути й інші види архівів: війна, вуха, тест-jar, ejb-клієнт ... або все-таки POM або BOM.
У pom.xml, залежно можуть бути визначені в декількох місцях: в <build><dependencies>частині, в dependencies managementчастині або ще в вигляді pluginдекларації ! Дійсно, деякі плагіни можуть мати певні залежності в класі шляхом під час їх виконання. Це не є загальним, але це може статися.
Ось приклад з документації , яка показує , що pluginі dependencyможуть працювати разом:

Наприклад, Maven Antrun Plugin версії 1.2 використовує програму Ant версії 1.6.5, якщо ви хочете використовувати останню версію Ant під час запуску цього плагіна, вам потрібно додати такий <dependencies>елемент, як:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>1.2</version>
        ...
        <dependencies>
          <dependency>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant</artifactId>
            <version>1.7.1</version>
          </dependency>
          <dependency>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant-launcher</artifactId>
            <version>1.7.1</version>
          </dependency>
         </dependencies>
      </plugin>
    </plugins>
  </build>
  ...
</project>

У Maven, залежно згадуються в форматі конкретного:
groupId:artifactId:packaging:classifier:version.
Класифікатор (який не є обов'язковим) та упаковка ( JARза замовчуванням) зазвичай не вказуються. Таким чином, загальний формат в dependencyдекларації , а: groupId:artifactId:version.
Ось приклад залежності, заявлений у <build><dependencies>частині:

<build>
   <dependencies>
      <dependency>
         <groupId>org.hibernate</groupId>
         <artifactId>hibernate-core</artifactId>
         <version>5.2.14.Final</version>
      </dependency>
   <dependencies>
</build>

На відміну від плагіна, залежність має сферу застосування.
Область за замовчуванням - compile. Це найпоширеніша область застосування (знову конвенція щодо конфігурації).
Діапазон compileозначає, що залежність доступна на всіх класах проекту.

Область визначає, за якими класовими маршрутами залежність слід додати. Наприклад, чи потрібен він під час компіляції та виконання або лише для складання та виконання тестів?

Наприклад, ми раніше визначали сплячку як compileзалежність, оскільки вона нам потрібна скрізь: компіляція джерела, тестова компіляція, час виконання тощо.
Але ми не хочемо, щоб тестуючі бібліотеки могли бути упаковані в додаток або посилатися у вихідний код . Отже, ми визначаємо testобласть для них:

<build>
   <dependencies>
     <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.1.0</version>
        <scope>test</scope>
     </dependency>
   <dependencies>
</build>

чудове пояснення !, оскільки я не добре розбираюся з налаштуванням залежностей на Java, я все ще сумніваюся, я зараз працюю в IntelliJ і створив проект maven, коли я намагався включити у webdriver-ieмене два варіанти, або включити його як pluginsабо dependency, я включив обидва для порівняння, і спостерігав, що обидва мають абсолютно однакову groupIdрізницю, це те, що pluginsвін не прийшов з конкретною версією, а dependencyпоставляється з 0.6.685. Чи можете ви пояснити це у непрофесійних (стосовно цього прикладу) термінах, в чому різниця, який слід використовувати, коли. Будь-яка пропозиція?
Ану

1
Важко дати найбільш точну відповідь, не побачивши свого pom.xml. Але те, що вас повинно зацікавити, - це те, що вказувати версію залежності є обов'язковою (у поточній пам’яті чи батьківській пам’яті, якщо це успадкована залежність) у будь-якій версії Maven, тоді як з Maven 3 (можливо, це погана ідея як функція), вказувати версію плагіна не обов’язково. Maven використовуватиме останню версію, доступну у сховищі релізів, де Maven її знаходить. (1/2)
davidxxx

1
Зауважте, що це поганий спосіб вказати плагін. Це не робить вашу збірку відтворюваною протягом часу ( cwiki.apache.org/confluence/display/MAVEN/… ). Ви повинні побачити попередження у збірці. Тож "у чому різниця?". Плагіни виконують завдання для побудови Maven, тоді як залежність - це бібліотеки (jar або будь-які інші), необхідні класному шляху під час збирання. Якщо збірка вашого проекту однакова в будь-якому випадку (використовуючи бібліотеку або плагін), це означає, що плагін безпорадний, як не використовується. (2/2)
davidxxx

6

Якщо ви приїжджаєте з передового фону, як я, і вам відомі Grunt і npm, подумайте про це так:

Перш за все буде працювати, скажімо, npm install grunt-contrib-copy --save-dev. Це як у Maven's <dependency></dependency>. Він завантажує файли, необхідні для виконання завдання зібрати.

Тоді ви налаштували б завдання в Gruntfile.js

copy: {
  main: {
    src: 'src/*',
    dest: 'dest/',
  },
}

Це як у Maven's <plugin>/<plugin>. Ви повідомляєте інструменту збирання, що робити з кодом, завантаженим npm / <dependency></dependency>.

Звичайно, це не точна аналогія, але достатньо близько, щоб допомогти обернути голову навколо неї.


4

Плагіни використовуються для додавання функціональних можливостей до Mavenсебе (наприклад, додавання eclipseпідтримки чи SpringBootпідтримки Mavenтощо). Ваш вихідний код необхідний для того, щоб пройти будь-яку фазу Maven ( compileабо, testнаприклад). У випадку, JUnitоскільки тестовий код в основному є частиною вашої кодової бази, і ви викликаєте JUnitконкретні команди всередині тестових наборів, і ці команди не передбачені, Java SDKтому JUnitповинні бути присутніми під час Mavenперебування на етапі тестування, і це обробляється шляхом згадування JUnitяк залежності. у вашому pom.xmlфайлі.


1

Maven по своїй суті є рамкою виконання плагінів - відповідно до формального та стандартного компактного визначення. Щоб зробити це більш зрозумілим, команди, які ви використовуєте, як maven-install/clean/compile/build etcдля створення / виконання банок, які ми іноді також виконуємо вручну. Отже, ті речі, які ви хочете запустити (або налаштувати, або виконати), ви в основному помістіть їх у тег залежності від mavens pom і відповідь, хто буде запускати ці залежності (необхідні для налаштування середовища) - плагіни.

        javac (compiler) dependency.java (dependency) 

1

Відповідь в одному рядку - базове розуміння

Плагін - це інструмент, який ви використовуєте при виконанні програми Maven

Залежність означає різновид будь-якої бібліотеки, яку ви будете використовувати у своєму коді


0

Плагін - це розширення до Maven, те, що використовується для створення вашого артефакту (maven-jar-plugin для прикладу, використовується для того, як ви здогадуєтесь, зробити банку з ваших складених класів та ресурсів).

Залежність - це бібліотека, яка потрібна програмі, яку ви будуєте, під час компіляції та / або тестування та / або часу виконання.

плагін і залежність

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