Quelle est la différence dans maven entre les balises de dépendance et de plug-in dans pom xml?

118

Je suis nouveau dans l'outil maven, j'ai fait un projet avec Spring et Hibernate et ils sont configurés dans pom.xml en tant que plugins, mais JUnit est étiqueté sous dépendance. Ma question est quelle est la logique derrière un en tant que plugin et un en tant que dépendance?

corail
la source

Réponses:

213

Les plugins et les dépendances sont des fichiers Jar.

Mais la différence entre eux est que la plupart du travail dans maven est effectué à l'aide de plugins; alors que la dépendance est juste un fichier Jar qui sera ajouté au chemin de classe lors de l'exécution des tâches.

Par exemple, vous utilisez un compilateur-plugin pour compiler les fichiers java. Vous ne pouvez pas utiliser le compilateur-plugin comme dépendance car cela ne fera qu'ajouter le plugin au chemin de classe et ne déclenchera aucune compilation. Les fichiers Jar à ajouter au chemin de classe lors de la compilation du fichier seront spécifiés en tant que dépendance.

Il en va de même avec votre scénario. Vous devez utiliser spring-plugin pour exécuter des exécutables spring [je ne sais pas à quoi servent les plugins spring. Je prends juste une estimation ici]. Mais vous avez besoin de dépendances pour exécuter ces exécutables. Et Junit est étiqueté sous dépendance car il est utilisé par le plugin surefire pour exécuter des tests unitaires.

Ainsi, nous pouvons dire que le plugin est un fichier Jar qui exécute la tâche, et la dépendance est un Jar qui fournit les fichiers de classe pour exécuter la tâche.

J'espère que cela répond à votre question!

r9891
la source
Est-ce que je peux me dire quelle est la différence entre la phase et l'objectif dans l'exécution? Comme je le savais, la phase parle du cycle de vie de maven .. mais pourquoi encore une fois? des indices? Parfois, je vois des gens mettre le mot-clé du cycle de vie à l'objectif ... ??? (?.?)
taymedee
@taymedee cette question SO décrit la différence: stackoverflow.com/questions/16205778/…
dev_feed
1
@ r981 Votre réponse doit être plus claire. Cette réponse est meilleure: stackoverflow.com/questions/26292073/…
Digital Impermanence
Je pense que le point manqué de cette réponse est que: les dépendances de niveau supérieur sont principalement utilisées par votre artefact au lieu des plugins.
gratuit
3
@MichaelPacheco, ce que je voulais dire, c'est que spring-plugin effectuera une certaine tâche d'exécution d'un ensemble de code, qui pourrait dépendre de certaines bibliothèques, qui seront spécifiées par les «dépendances». Prenons un exemple différent: vous avez besoin d'un compilateur pour exécuter un morceau de code; Ici, votre compilateur est un plugin et votre code est l'exécutable. Votre compilateur seul est capable d'exécuter n'importe quel code, mais votre code peut dépendre d'une bibliothèque, disons apache commons, qui sera une dépendance. Votre compilateur ne peut compiler le code que lorsque les dépendances sont présentes dans le chemin de classe. J'espère que c'est clair maintenant.
r9891 le
37

Maven lui-même peut être décrit comme un robot culinaire qui a de nombreuses unités différentes qui peuvent être utilisées pour accomplir différentes tâches. Ces unités sont appelées plugins. Par exemple, pour compiler votre projet utilisé par maven maven-compiler-plugin, pour exécuter des tests - maven-surefire-pluginet ainsi de suite.

La dépendance en termes de maven est un ensemble de classes dont dépend votre projet. Cela peut être jar, war, etc. Par exemple, si vous voulez être capable d'écrire des tests JUnit, vous devrez utiliser des annotations et des classes JUnit donc vous devez déclarer que votre projet dépend de JUnit.

Andrew Logvinov
la source
merci pour la réponse rapide, désolé mais je suis toujours confus car je sais que JUnit est également un framework et (hibernate, spring) vient également sous framework uniquement, cela signifie que dans les cas (hibernate, spring) pourrait également être configuré dans les balises de dépendance ? j'espère que vous avez ma question.
Coral
Oui, et pour autant que je sache, le plugin Spring maven n'existe pas. Habituellement, les bibliothèques Spring (ou Hibernate, ou JUnit, ou TestNG, etc.) sont déclarées comme dépendances pour votre projet. Si vous êtes nouveau sur maven, je vous recommande de lire ce très bon livre.
Andrew Logvinov
@AndrewLogvinov - J'ai un projet multi pom pour les tests d'automatisation des API. L'un des projets maven a des tests d'automatisation. La section build du projet pom ne contenait qu'un seul plugin - le plugin maven surefire en référence à une suite. La balise de construction entière a été supprimée. Pouvez-vous me dire ce que cela signifie? Merci.
MasterJoe
15

Les plugins et les dépendances sont des choses très différentes et elles sont complémentaires.

Quels sont les plugins?

Les plugins effectuent des tâches pour une version Maven. Ceux-ci ne sont pas inclus dans l'application.

Ce sont le cœur de Maven.
Toute tâche exécutée par Maven est effectuée par des plugins .
Il existe deux catégories de plugins: le buildet les reportingplugins :

  • Les plugins de construction seront exécutés pendant la construction et ils doivent être configurés dans l' <build/>élément du POM.
  • Les plugins de reporting seront exécutés lors de la génération du site et doivent être configurés dans l' <reporting/élément> du POM.

Selon l'objectif maven spécifié dans la ligne de commande (par exemple mvn clean, mvn clean packageou mvn site), un cycle de vie spécifique sera utilisé et un ensemble spécifique d'objectifs de plugins sera exécuté.
Il y a trois haut-construction: cycles de vie default, cleanet site. Le defaultcycle de vie gère le déploiement de votre projet, le cleancycle de vie gère le nettoyage du projet, tandis que le sitecycle de vie gère la création de la documentation du site de votre projet.

Un objectif de plugin peut être lié à une phase spécifique d'un cycle de vie spécifique.
Par exemple , les maven-compiler-pluginbinds par défaut , le compilebut de la phase du cycle de vie: compile.
La plupart des plugins maven (à la fois les plugins principaux et les plugins tiers) préfèrent la convention à la configuration. Donc, ceux-ci lient généralement un objectif de plugin à une phase spécifique pour simplifier leur utilisation.

C'est plus net et moins sujet aux erreurs:

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

que :

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

Quelles sont les dépendances?

Les dépendances sont des artefacts / composants Maven requis dans le chemin de classe lors de la construction de Maven.
Ceux-ci peuvent être emballés dans l'application mais pas nécessairement (voir scopeci - dessous).

La plupart des dépendances sont jar mais il peut aussi s'agir d'autres types d'archives: war, ear, test-jar, ejb-client ... ou encore POM ou BOM.
Dans un pom.xml, les dépendances peuvent être spécifiées à plusieurs endroits: la <build><dependencies>partie, la dependencies managementpartie ou encore dans une plugindéclaration ! En effet, certains plugins peuvent avoir besoin d'avoir des dépendances dans le classpath lors de leur exécution. Ce n'est pas courant mais cela peut arriver.
Voici un exemple de la documentation qui montre cela pluginet dependencypeut fonctionner ensemble:

Par exemple, le Maven Antrun Plugin version 1.2 utilise Ant version 1.6.5, si vous souhaitez utiliser la dernière version Ant lors de l'exécution de ce plugin, vous devez ajouter un <dependencies>élément comme le suivant:

<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>

Dans Maven, les dépendances sont référencées dans un format spécifique:
groupId:artifactId:packaging:classifier:version.
Le classificateur (qui est facultatif) et l'empaquetage ( JARpar défaut) ne sont pas généralement spécifiés. Ainsi , le format commun dans la dependencydéclaration est plutôt: groupId:artifactId:version.
Voici un exemple de dépendance déclarée dans la <build><dependencies>pièce:

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

Contrairement à un plugin, une dépendance a une portée.
La portée par défaut est compile. C'est la portée la plus couramment nécessaire (convention sur la configuration à nouveau).
L' compileétendue signifie que la dépendance est disponible dans tous les chemins de classe d'un projet.

La portée définit dans quels chemins de classe la dépendance doit être ajoutée. Par exemple en avons-nous besoin à la compilation et à l'exécution, ou uniquement pour la compilation et l'exécution des tests?

Par exemple, nous avons précédemment défini Hibernate comme une compiledépendance car nous en avons besoin partout: compilation source, compilation de test, runtime et ainsi de suite ...
Mais nous ne voulons pas que les bibliothèques de test soient empaquetées dans l'application ou référencées dans le code source . Nous spécifions donc leur testportée:

<build>
   <dependencies>
     <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.1.0</version>
        <scope>test</scope>
     </dependency>
   <dependencies>
</build>
davidxxx
la source
excellente explication!, comme je ne suis pas bien familiarisé avec la configuration de dépendances en Java, j'ai encore un doute, je travaille actuellement dans IntelliJ et j'ai créé un projet maven, lorsque j'ai essayé d'inclure, webdriver-iej'ai deux options, soit l'inclure comme pluginsou dependency, j'ai inclus les deux pour comparer, et j'ai observé que les deux avaient exactement la même chose, groupIdla seule différence était que le pluginsne venait pas avec une version spécifique mais était dependencylivré avec 0.6.685. Pourriez-vous l'expliquer en termes simples (par rapport à cet exemple) quelle est la différence, lequel utiliser quand. Toute suggestion?
Anu
1
Difficile de donner la réponse la plus exacte sans voir votre pom.xml. Mais une chose qui devrait vous intéresser est que la spécification de la version de dépendance est obligatoire (dans le pom actuel ou dans le pom parent s'il s'agit d'une dépendance héritée) dans n'importe quelle version de Maven alors que depuis Maven 3 (probablement une mauvaise bonne idée en tant que fonctionnalité), la spécification de la version du plugin est facultative. Maven utilisera la dernière version disponible dans le référentiel de versions où Maven la trouve. (1/2)
davidxxx
1
Notez que c'est une mauvaise manière de spécifier un plugin. Cela ne rend pas votre build reproductible au fil du temps ( cwiki.apache.org/confluence/display/MAVEN/… ). Vous devriez voir un avertissement dans la construction. Alors, quelle est la difference ?". Les plugins effectuent des tâches pour une construction Maven tandis que les dépendances sont des bibliothèques (jar ou autre) nécessaires dans le chemin de classe pendant la construction. Si la construction de votre projet est la même quel que soit le cas (en utilisant la librairie ou le plugin), cela signifie que le plugin est impuissant car non utilisé. (2/2)
davidxxx
6

Si vous venez d'un arrière-plan frontal comme moi et que vous connaissez Grunt et npm, pensez-y comme suit:

D' abord , vous courriez, par exemple, npm install grunt-contrib-copy --save-dev. C'est comme celui de Maven <dependency></dependency>. Il télécharge les fichiers nécessaires pour exécuter une tâche de construction.

Ensuite, vous configurez la tâche dans Gruntfile.js

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

C'est comme celui de Maven <plugin>/<plugin>. Vous indiquez à l'outil de construction quoi faire avec le code téléchargé par npm / <dependency></dependency>.

Bien sûr, ce n'est pas une analogie exacte, mais suffisamment proche pour vous aider à comprendre.

Kevin
la source
4

Les plug-ins sont utilisés pour ajouter des fonctionnalités à Mavenlui-même (comme l'ajout de eclipsesupport ou de SpringBootsupport à Mavenetc.). Des dépendances sont nécessaires à votre code source pour passer n'importe quelle phase Maven ( compileou testpar exemple). Dans le cas JUnitoù le code de test fait essentiellement partie de votre base de code et que vous appelez JUnitdes commandes spécifiques à l'intérieur des suites de tests et que ces commandes ne sont pas fournies par, doivent Java SDKdonc JUnitêtre présentes au moment Mavende la phase de test et cela est géré en mentionnant JUnitcomme une dépendance dans votre pom.xmldossier.

café
la source
1

Maven en son cœur est un cadre d'exécution de plugin - selon la définition compacte formelle et standard. Pour que ce soit plus clair, les commandes que vous utilisez comme maven-install/clean/compile/build etcpour créer / exécuter des fichiers jars, que nous exécutons parfois aussi manuellement. Donc, les choses que vous voulez exécuter (ou configurer ou exécuter), vous les mettez essentiellement dans la balise de dépendance de mavens pom et la réponse pour savoir qui exécutera ces dépendances (requises pour la configuration de l'environnement) sera les plugins.

        javac (compiler) dependency.java (dependency) 
Himanshu Ahuja
la source
1

Réponse en une ligne - compréhension de base

Le plugin est un outil que vous utilisez lors de l'exécution de votre build maven

La dépendance désigne le type de bibliothèque que vous utiliserez dans votre code

Yogesh Rathi
la source
0

Un plugin est une extension de Maven, quelque chose utilisé pour produire votre artefact (maven-jar-plugin par exemple, est utilisé pour, vous le devinez, créer un pot à partir de vos classes et ressources compilées).

Une dépendance est une bibliothèque nécessaire à l'application que vous créez, à la compilation et / ou au test et / ou à l'exécution.

plugin et dépendance

Déc
la source