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

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 marqué sous la dépendance. Ma question est la suivante: quelle est la logique derrière l’un en tant que plug-in et l’autre en tant que dépendance?

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

Mais la différence entre eux, la plupart du travail dans maven est fait en utilisant des plugins; alors que la dépendance est juste un fichier Jar qui sera ajouté au classpath lors de l’exécution des tâches.

Par exemple, vous utilisez un plug-in de compilation pour comstackr les fichiers Java. Vous ne pouvez pas utiliser comstackr-plugin en tant que dépendance car cela ne fera qu’append le plugin au classpath et ne déclenchera aucune compilation. Les fichiers Jar à append au classpath lors de la compilation du fichier seront spécifiés en tant que dépendance.

Même chose avec votre scénario. Vous devez utiliser un plug-in Spring pour exécuter des exécutables Spring [je ne sais pas à quoi servent les plug-ins Spring. Je prends juste une conjecture ici]. Mais vous avez besoin de dépendances pour exécuter ces exécutables. Et Junit est marqué sous la dépendance car il est utilisé par surefire-plugin pour exécuter des tests unitaires.

Donc, 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!

Maven lui-même peut être décrit comme un robot culinaire qui possède de nombreuses unités différentes pouvant être utilisées pour accomplir différentes tâches. Ces unités sont appelées plugins. Par exemple, pour comstackr votre projet, maven utilise maven-comstackr-plugin , pour exécuter des tests – maven-surefire-plugin , etc.

La dépendance en termes de maven est un élément de classes intégré dont dépend votre projet. Cela peut être jar, war, etc. Par exemple, si vous voulez pouvoir écrire le test JUnit, vous devrez utiliser les annotations et les classes de JUnit. Vous devez donc déclarer que votre projet dépend de JUnit.

Les plug-ins sont utilisés pour append des fonctionnalités à Maven lui-même (comme l’ajout du support eclipse ou du support SpringBoot à Maven etc.). Votre code source nécessite des dépendances pour passer toute phase Maven ( comstack ou test par exemple). Dans le cas de JUnit puisque le code de test fait partie de votre base de code et que vous appelez des commandes spécifiques à JUnit dans les suites de test et que ces commandes ne sont pas fournies par Java SDK JUnit doit être présent lors de la phase de test. manipulé en mentionnant JUnit comme une dépendance dans votre fichier pom.xml .

Si vous venez d’un environnement comme moi et que vous connaissez Grunt et npm, pensez à ceci:

Tout d’abord, vous exécuterez, disons, npm install grunt-consortingb-copy --save-dev . C’est comme . Il télécharge les fichiers nécessaires à l’exécution d’une tâche de génération.

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

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

C’est comme / . Vous dites à l’outil de compilation que faire avec le code téléchargé par npm / .

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

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

Quels sont les plugins?

Les plugins effectuent des tâches pour une construction Maven. Ceux-ci ne sont pas emballés 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: les plugins de build et de reporting :

  • Les plugins de construction seront exécutés pendant la construction et ils devraient être configurés dans l’élément du POM.
  • Les plug-ins de reporting seront exécutés lors de la génération du site et ils devront être configurés dans l’élément > du POM.

Selon l’objective maven spécifié dans la ligne de commande (par exemple, mvn clean , mvn clean package ou mvn site ), un cycle de vie spécifique sera utilisé et un ensemble spécifique de buts de plugins sera exécuté.
Il existe trois cycles de vie de génération intégrés: default , clean et site . Le cycle de vie default gère le déploiement de votre projet, le cycle de vie clean gère le nettoyage du projet, tandis que le cycle de vie du site gère la création de la documentation du site de votre projet.

Un objective de plugin peut être lié à une phase spécifique d'un cycle de vie spécifique.
Par exemple, le maven-comstackr-plugin lie par défaut l'objective de comstack à la phase du cycle de vie: comstack .
La plupart des plugins maven (plugins core et plugins tiers) favorisent la convention sur la configuration. Donc, ceux-ci ont généralement lié un objective de plug-in à une phase spécifique pour simplifier leur utilisation.

C'est plus net et moins sujet aux erreurs:

  maven-comstackr-plugin 3.7.0  

que :

  maven-comstackr-plugin 3.7.0   comstack  comstack     

Quelles sont les dépendances?

Les dépendances sont des artefacts Maven requirejs lors de la construction de Maven.
Ceux-ci peuvent être emballés dans l'application mais pas nécessairement (voir la scope ci-dessous).

La plupart des dépendances sont jar mais elles peuvent aussi être d'autres types d'archives: war, ear, test-jar, ejb-client ... ou encore POM ou BOM.
Dans un fichier pom.xml, les dépendances peuvent être spécifiées à plusieurs endroits: la partie , la partie de dependencies management ou encore une déclaration de plugin - plugin ! En effet, certains plugins peuvent avoir besoin de certaines dépendances dans le classpath lors de leur exécution. Ce n'est pas commun mais cela peut arriver.
Voici un exemple de la documentation qui montre que le plugin - plugin et la dependency peuvent fonctionner ensemble:

Par exemple, la version 1.2 de Maven Antrun Plugin utilise Ant version 1.6.5, si vous souhaitez utiliser la dernière version de Ant lors de l'exécution de ce plug-in, vous devez append l'élément comme suit:

  ...    org.apache.maven.plugins maven-antrun-plugin 1.2 ...   org.apache.ant ant 1.7.1   org.apache.ant ant-launcher 1.7.1      ...  

Dans Maven, les dépendances sont référencées dans un format spécifique:
groupId:artifactId:packaging:classifier:version .
Le classificateur (facultatif) et le package ( JAR par défaut) ne sont pas généralement spécifiés. Donc, le format commun dans la déclaration de dependency est plutôt: groupId:artifactId:version .
Voici un exemple de dépendance déclarée dans la partie :

    org.hibernate hibernate-core 5.2.14.Final    

Contrairement à un plugin, une dépendance a une scope.
La scope par défaut est comstack . C'est la scope la plus couramment requirejse (convention sur la configuration à nouveau).
La scope de comstack signifie que la dépendance est disponible dans tous les classpath d'un projet.

La scope 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 seulement pour la compilation et l'exécution des tests?

Par exemple, nous avons précédemment défini Hibernate comme une dépendance de comstack car nous en avons besoin partout: compilation source, compilation de test, runtime, etc.
Mais nous ne voulons pas que les bibliothèques de test soient intégrées à l'application ou référencées dans le code source. Nous spécifions donc la scope du test pour eux:

    org.junit.jupiter junit-jupiter-engine 5.1.0 test