Відповіді:
І плагіни, і залежності - це файли Jar.
Але різниця між ними полягає в тому, що більша частина роботи в maven виконується за допомогою плагінів; тоді як залежність - це лише файл Jar, який буде доданий до classpath під час виконання завдань.
Наприклад, ви використовуєте компілятор-плагін для компіляції файлів Java. Ви не можете використовувати компілятор-плагін як залежність, оскільки це додасть лише плагін до classpath і не запустить жодної компіляції. Файли Jar, які будуть додані до класного шляху при компілюванні файлу, будуть вказані як залежність.
Те саме стосується вашого сценарію. Ви повинні використовувати spring-плагін для виконання деяких весняних виконуваних файлів [я не впевнений, для чого використовуються весняні плагіни. Я просто тут здогадуюсь]. Але вам потрібні залежності для виконання цих виконуваних файлів. І Junit позначений тегом під залежністю, оскільки він використовується плагін-верифікатором для виконання одиничних тестів.
Отже, можна сказати, плагін - це файл Jar, який виконує завдання, а залежність - Jar, який забезпечує файли класу для виконання завдання.
Сподіваємось, що відповість на ваше запитання!
Сам Мейвен можна описати як кухонний комбайн, який має багато різних підрозділів, які можна використовувати для виконання різних завдань. Ці одиниці називаються плагінами. Наприклад, для складання ваших проектів Maven maven-compiler-plugin
, проведення тестів - maven-surefire-plugin
і так далі.
Залежність в термінах Maven - це упакований предмет класів, від якого залежить ваш проект. Це може бути баночка, війна тощо. Наприклад, якщо ви хочете мати можливість написати тест JUnit, вам доведеться використовувати анотації та класи JUnit, таким чином, ви повинні заявити, що ваш проект залежить від JUnit.
Плагіни та залежності - це дуже різні речі, і вони доповнюють один одного.
Плагіни виконують завдання для збірки Maven. Вони не вкладаються у додаток.
Це серце Мейвена.
Будь-яке завдання, виконане Maven, виконується плагінами .
Є дві категорії плагінів: і плагіни :build
reporting
<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>
webdriver-ie
мене два варіанти, або включити його як plugins
або dependency
, я включив обидва для порівняння, і спостерігав, що обидва мають абсолютно однакову groupId
різницю, це те, що plugins
він не прийшов з конкретною версією, а dependency
поставляється з 0.6.685
. Чи можете ви пояснити це у непрофесійних (стосовно цього прикладу) термінах, в чому різниця, який слід використовувати, коли. Будь-яка пропозиція?
pom.xml
. Але те, що вас повинно зацікавити, - це те, що вказувати версію залежності є обов'язковою (у поточній пам’яті чи батьківській пам’яті, якщо це успадкована залежність) у будь-якій версії Maven, тоді як з Maven 3 (можливо, це погана ідея як функція), вказувати версію плагіна не обов’язково. Maven використовуватиме останню версію, доступну у сховищі релізів, де Maven її знаходить. (1/2)
Якщо ви приїжджаєте з передового фону, як я, і вам відомі 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>
.
Звичайно, це не точна аналогія, але достатньо близько, щоб допомогти обернути голову навколо неї.
Плагіни використовуються для додавання функціональних можливостей до Maven
себе (наприклад, додавання eclipse
підтримки чи SpringBoot
підтримки Maven
тощо). Ваш вихідний код необхідний для того, щоб пройти будь-яку фазу Maven ( compile
або, test
наприклад). У випадку, JUnit
оскільки тестовий код в основному є частиною вашої кодової бази, і ви викликаєте JUnit
конкретні команди всередині тестових наборів, і ці команди не передбачені, Java SDK
тому JUnit
повинні бути присутніми під час Maven
перебування на етапі тестування, і це обробляється шляхом згадування JUnit
як залежності. у вашому pom.xml
файлі.
Maven по своїй суті є рамкою виконання плагінів - відповідно до формального та стандартного компактного визначення. Щоб зробити це більш зрозумілим, команди, які ви використовуєте, як maven-install/clean/compile/build etc
для створення / виконання банок, які ми іноді також виконуємо вручну. Отже, ті речі, які ви хочете запустити (або налаштувати, або виконати), ви в основному помістіть їх у тег залежності від mavens pom і відповідь, хто буде запускати ці залежності (необхідні для налаштування середовища) - плагіни.
javac (compiler) dependency.java (dependency)
Відповідь в одному рядку - базове розуміння
Плагін - це інструмент, який ви використовуєте при виконанні програми Maven
Залежність означає різновид будь-якої бібліотеки, яку ви будете використовувати у своєму коді
Плагін - це розширення до Maven, те, що використовується для створення вашого артефакту (maven-jar-plugin для прикладу, використовується для того, як ви здогадуєтесь, зробити банку з ваших складених класів та ресурсів).
Залежність - це бібліотека, яка потрібна програмі, яку ви будуєте, під час компіляції та / або тестування та / або часу виконання.