В чем разница в maven между тегами dependency и plugin в pom xml?


119

Я новичок в инструменте maven, я создал проект с Spring и Hibernate, и они настроены в pom.xml как плагины, но JUnit помечен как зависимость. Мой вопрос в том, какова логика одного как плагина, а другого как зависимости?

Ответы:


214

И плагины, и зависимости представляют собой файлы Jar.

Но разница между ними в том, что большая часть работы в maven выполняется с использованием плагинов; тогда как зависимость - это просто файл Jar, который будет добавлен в путь к классам при выполнении задач.

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

То же самое и с вашим сценарием. Вы должны использовать spring-plugin для выполнения некоторых исполняемых файлов spring [я не уверен, для чего используются Spring-plugin. Я здесь просто догадываюсь]. Но вам нужны зависимости для выполнения этих исполняемых файлов. А Junit помечен как зависимый, поскольку он используется плагином surefire для выполнения модульных тестов.

Итак, мы можем сказать, что плагин - это файл Jar, который выполняет задачу, а зависимость - это Jar, который предоставляет файлы классов для выполнения задачи.

Надеюсь это ответит на твой вопрос!


Могу ли я сказать мне, в чем разница между этапом и целью выполнения? Как я знал, фаза говорит о жизненном цикле maven ... но почему снова цель? какие-нибудь намеки? Иногда я вижу, как люди ставят цель жизненного цикла ... ??? (?.?)
taymedee

@taymedee этот вопрос SO описывает разницу: stackoverflow.com/questions/16205778/…
dev_feed

1
@ r981 Ваш ответ должен быть более ясным. Этот ответ лучше: stackoverflow.com/questions/26292073/…
Digital Impermanence 02

Я думаю, что упущенный момент этого ответа заключается в том, что зависимости верхнего уровня в основном используются вашим артефактом, а не плагинами.
lfree

3
@MichaelPacheco, я имел в виду, что spring-plugin будет выполнять определенную задачу по выполнению набора кода, который может зависеть от некоторых библиотек, которые будут указаны в «зависимостях». Возьмем другой пример: вам нужен компилятор для выполнения фрагмента кода; Здесь ваш компилятор - это плагин, а ваш код - исполняемый файл. Только ваш компилятор способен выполнять любой код, но ваш код может зависеть от библиотеки, скажем, apache commons, которая будет зависимостью. Ваш компилятор может компилировать код только в том случае, если зависимости присутствуют в пути к классам. Надеюсь, теперь все ясно.
r9891 06

37

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

Зависимость с точки зрения maven - это пакет классов, от которых зависит ваш проект. Это может быть jar, war и т. Д. Например, если вы хотите написать тест JUnit, вам придется использовать аннотации и классы JUnit, поэтому вы должны объявить, что ваш проект зависит от JUnit.


спасибо за быстрый ответ, извините, но все же я смущен, поскольку я знаю, что JUnit также является фреймворком, и (спящий режим, весна) также входит только в фреймворк, так что это означает, что в случаях (спящий режим, весна) также можно настроить в тегах зависимости ? Надеюсь, у вас есть вопрос.
Coral

Да, и, насколько мне известно, плагина Spring maven не существует. Обычно библиотеки Spring (или Hibernate, или JUnit, или TestNG и т. Д.) Объявляются как зависимости для вашего проекта. Если вы новичок в maven, я рекомендую прочитать эту очень хорошую книгу.
Андрей Логвинов

@AndrewLogvinov - У меня есть проект с несколькими модулями для тестирования автоматизации API. В одном из проектов maven есть тесты автоматизации. В разделе сборки проекта pom был только 1 плагин - плагин maven surefire со ссылкой на набор. Весь тег сборки был удален. Подскажите, пожалуйста, что это значит? Спасибо.
MasterJoe

15

Плагины и зависимости - это разные вещи, и они дополняют друг друга.

Какие есть плагины?

Плагины выполняют задачи для сборки Maven. Они не упакованы в приложение.

Это сердце Maven.
Любая задача, выполняемая Maven, выполняется плагинами .
Есть две категории плагинов: и плагины :buildreporting

  • Плагины сборки будут выполняться во время сборки, и они должны быть настроены в <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>

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

1
Трудно дать наиболее точный ответ, не увидев своего pom.xml. Но то, что должно вас заинтересовать, заключается в том, что указание версии зависимости является обязательным (в текущем pom или в родительском pom, если это унаследованная зависимость) в любой версии 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 <dependency></dependency>. Он загружает файлы, необходимые для выполнения задачи сборки.

Затем вы должны настроить задачу в Gruntfile.js

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

Это похоже на maven <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для создания / выполнения jar-файлов, которые мы иногда тоже запускаем вручную. Итак, вещи, которые вы хотите запустить (или настроить или выполнить), вы в основном помещаете в тег зависимости 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.