Я новичок в инструменте maven, я создал проект с Spring и Hibernate, и они настроены в pom.xml как плагины, но JUnit помечен как зависимость. Мой вопрос в том, какова логика одного как плагина, а другого как зависимости?
Я новичок в инструменте maven, я создал проект с Spring и Hibernate, и они настроены в pom.xml как плагины, но JUnit помечен как зависимость. Мой вопрос в том, какова логика одного как плагина, а другого как зависимости?
Ответы:
И плагины, и зависимости представляют собой файлы Jar.
Но разница между ними в том, что большая часть работы в maven выполняется с использованием плагинов; тогда как зависимость - это просто файл Jar, который будет добавлен в путь к классам при выполнении задач.
Например, вы используете плагин компилятора для компиляции файлов java. Вы не можете использовать плагин компилятора в качестве зависимости, поскольку это только добавит плагин в путь к классам и не вызовет компиляцию. Файлы Jar, которые будут добавлены в путь к классам при компиляции файла, будут указаны как зависимость.
То же самое и с вашим сценарием. Вы должны использовать spring-plugin для выполнения некоторых исполняемых файлов spring [я не уверен, для чего используются Spring-plugin. Я здесь просто догадываюсь]. Но вам нужны зависимости для выполнения этих исполняемых файлов. А Junit помечен как зависимый, поскольку он используется плагином surefire для выполнения модульных тестов.
Итак, мы можем сказать, что плагин - это файл Jar, который выполняет задачу, а зависимость - это Jar, который предоставляет файлы классов для выполнения задачи.
Надеюсь это ответит на твой вопрос!
Сам Maven можно охарактеризовать как кухонный комбайн, который имеет множество различных устройств, которые можно использовать для выполнения различных задач. Эти модули называются плагинами. Например, maven использует для компиляции вашего проекта maven-compiler-plugin
, запуска тестов maven-surefire-plugin
и так далее.
Зависимость с точки зрения maven - это пакет классов, от которых зависит ваш проект. Это может быть jar, war и т. Д. Например, если вы хотите написать тест JUnit, вам придется использовать аннотации и классы JUnit, поэтому вы должны объявить, что ваш проект зависит от JUnit.
Плагины и зависимости - это разные вещи, и они дополняют друг друга.
Плагины выполняют задачи для сборки Maven. Они не упакованы в приложение.
Это сердце Maven.
Любая задача, выполняемая Maven, выполняется плагинами .
Есть две категории плагинов: и плагины :build
reporting
<build/>
элементе из POM.<reporting/
элементе> из POM. В соответствии с целью maven, указанной в командной строке (например 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-файлы, но это могут быть и другие типы архивов: war, ear, test-jar, ejb-client ... или все еще POM или BOM.
В pom.xml, зависимости могут быть определены в нескольких местах: в <build><dependencies>
части, в dependencies management
части или еще в виде plugin
декларации ! Действительно, некоторым плагинам может потребоваться наличие некоторых зависимостей в пути к классам во время их выполнения. Это нечасто, но такое бывает.
Вот пример из документации, который показывает это plugin
и dependency
может работать вместе:
Например, плагин Maven Antrun версии 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
действия означает, что зависимость доступна во всех путях к классам проекта.
Область видимости определяет, в какие пути к классам следует добавить зависимость. Например, нужно ли оно нам во время компиляции и выполнения или только для компиляции и выполнения тестов?
Например, мы ранее определили Hibernate как 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
. Но то, что должно вас заинтересовать, заключается в том, что указание версии зависимости является обязательным (в текущем pom или в родительском pom, если это унаследованная зависимость) в любой версии Maven, а с Maven 3 (вероятно, плохая хорошая идея в качестве функции), указывать версию плагина необязательно. Maven будет использовать последнюю версию, доступную в репозитории выпуска, в котором Maven ее находит. (1/2)
Если вы работаете с фронтендом вроде меня и знакомы с Grunt и npm, подумайте об этом так:
Прежде всего будет работать, скажем, npm install grunt-contrib-copy --save-dev
. Это похоже на maven <dependency></dependency>
. Он загружает файлы, необходимые для выполнения задачи сборки.
Затем вы должны настроить задачу в Gruntfile.js
copy: {
main: {
src: 'src/*',
dest: 'dest/',
},
}
Это похоже на maven <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
для создания / выполнения jar-файлов, которые мы иногда тоже запускаем вручную. Итак, вещи, которые вы хотите запустить (или настроить или выполнить), вы в основном помещаете в тег зависимости mavens pom и отвечаете на то, кто будет запускать эти зависимости (необходимые для настройки среды), как плагины.
javac (compiler) dependency.java (dependency)
Однострочный ответ - базовое понимание
Плагин - это инструмент, который вы используете при выполнении сборки maven.
Зависимость означает вид любой библиотеки, которую вы будете использовать в своем коде.
Плагин - это расширение Maven, что-то, что используется для создания вашего артефакта (maven-jar-plugin для примера, как вы догадываетесь, используется для создания баночки из ваших скомпилированных классов и ресурсов).
Зависимость - это библиотека, которая требуется приложению, которое вы создаете, во время компиляции и / или тестирования и / или времени выполнения.