Développeur relativement nouveau ici, même si je l'utilise depuis un moment, j'espère consolider mes fondamentaux Maven. Une partie de mon problème est que j'ai non une expérience de Ant, qui semble provenir de nombreuses explications. J'ai lu et regardé des tutoriels, et j'entends toujours les mêmes termes:
D'après ce que j'ai appris, il semble que le cycle de vie soit le plus vaste du groupe et qu'il soit composé (ou complété par) de phases, de plugins et/ou d'objectifs.
Question: Pouvez-vous fournir des informations sur la relation entre ces termes et les exemples les plus courants?
Le plus explicite et basique, mieux c'est!
La réponse de @ Drejc n'est pas correct dans son intégralité.
En particulier:
Chacune de ces phases peut avoir un objectif à exécuter
avant ou après une phase, par exemple:
•pré-installer - ...
•post-package - ...Vous pouvez voir les objectifs sous forme de phases "insérées" supplémentaires si vous le souhaitez.
[Barré de déclarations incorrectes de ma part.]
Un cycle de vie Maven est un concept (abstrait) qui couvre toutes les étapes (ou mieux: toutes les étapes que les concepteurs Maven ont créées décidé de prendre en charge) pendant la durée de développement d'un projet. Ces étapes sont appelées phases dans la terminologie Maven.
Un plugin Maven est un conteneur pour/fournisseur de objectifs. Le code implémenté dans les objectifs est le véritable bourreau de travail. ( Maven, dans son cœur, ne fait que gérer des plugins et exécuter des objectifs ). Chacun des objectifs d'un plugin peut être assigné/lié à l'une des phases du cycle de vie.
Lors de l'appel de mvn <phase>
_ Maven passe toutes les phases (à chaque fois) et exécute tous les objectifs (fourni par les plugins) qui ont été liés à l’une des phases avant et jusqu’à (et y compris) la phase donnée. S'il y a une phase sans but lié à celle-ci, rien n'est fait. Mais la phase est quand même passée.
C'est à dire. vous ne pouvez pas "'insérer' des 'phases supplémentaires" dans l'un des cycles de vie intégrés de Maven. Ils sont déjà là, toujours! Vous pouvez développer votre propre cycle de vie avec ses propres phases, mais cela va bien au-delà de la simple utilisation de Maven.
Les phases appelées "pré-installation" ou "post-package" n'existent pas.
Références:
Maven, Introduction au cycle de vie de la construction
Si vous vous êtes déjà demandé comment Maven sait quoi faire sans imposer d'objectif dans le POM, il existe un lien vers default-bindings.xml
à la fin qui se trouve dans <Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/default-bindings.xml
.
Les phases des cycles de vie intégrés ( clean, défaut, site) sont déclarées dans <Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/components.xml
sous .../<component>/<role>org.Apache.maven.lifecycle.Lifecycle
.
Maven: La référence complète, Chapitre 4. Le cycle de vie de la construction
Maven: Cycle de vie vs phase vs plugin vs objectif
Répondre tardivement pour clarifier encore un autre niveau de granularité manquant dans ce fil de discussion: exécutions (d'un objectif), qui sont les plus petites unités d'une construction Maven.
Par conséquent, nous avons des cycles de construction (essentiellement, un ensemble d’actions pour un objectif global spécifique), qui consiste en phases (granularité inférieure, une étape du cycle), qui peut appeler un ensemble d’objectifs configurés fournis par certains plugins . C'est-à-dire que Maven est (également) un exécuteur de plugins, chaque plugin peut offrir un ou plusieurs objectifs. Vous décidez ensuite (également) quel objectif est associé à quelle phase, la plupart du temps dans le cycle de vie par défaut (sans aucune, c'est-à-dire par défaut). Mais vous pouvez réellement avoir encore un autre niveau: les exécutions (du même objectif, du même plugin, ou des objectifs différents de différents plugins)
Une image que je me suis préparé à reprendre le tout
Et en effet, voici comment Maven le montre (sa plus petite unité de travail) via la chaîne unique de son journal de construction:
plugin-artifactId:plugin-version:plugin-goal (goal-execution-id) @ project-name
Par exemple, nous aurions:
[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ sample-project ---
Ce qui signifie en effet (à travers différents niveaux de granularité):
compile
(non mentionné, malheureusement)>artifactId
et version
)>compile
objectif>default-compile
exécutionC'est unique parce qu'en effet vous pouvez avoir le même objectif (du même plugin) lié à différentes phases ou à la même phase mais à différentes exécutions (c'est-à-dire avec des configurations différentes). Le maven-compiler-plugin
, par exemple, est également utilisé pendant le test-compile
phase (une phase différente) pour compiler le code de test (via son testCompile
objectif) dans une exécution différente (default-testCompile
). Vous pouvez également compiler (à l'aide du même plugin et du même objectif) du code généré automatiquement au cours d'une phase différente, telle que définie par une exécution que vous avez spécifiée dans le POM (et éventuellement une configuration différente).
Les exécutions par défaut sont fournies directement via liaisons d'empaquetage Maven , c'est-à-dire par défaut (et en appliquant la convention de configuration) Maven appelle déjà certains objectifs (des plugins standard) au cours de certaines phases. Les identifiants d'exécution de ces invocations par défaut sont définis selon certaines conventions .
Cela explique également pourquoi si vous voulez vraiment remplacer un comportement par défaut (liaison) d'une construction Maven, vous devez spécifier (remplacer) exactement le même identifiant d'exécution dans votre POM pour le même plugin. Vous pouvez, par exemple, ignorer la compilation en définissant simplement une exécution du fichier maven-compiler-plugin
avec le même default-compile
id, mais lié à une phase non existante (ou vide).
Pour faire court : une exécution indique à Maven quel objectif exécuter avec quelle configuration dans quelle phase.
Certaines exécutions sont fournies par défaut (defaul bindings), ce qui explique pourquoi les lignes maven minimal pom de seulement 6 peuvent déjà le faire beaucoup (compiler, tester, empaqueter, etc.): exécuter les objectifs des plugins standards dans certaines phases: c'est la convention sur la configuration. Ensuite, via le pom.xml
configuration vous pouvez ajouter des choses (exécutions) à la construction ou influencer le comportement de plugins déjà configurés (dans ce cas pas de executions
section, mais seulement configuration
suffirait).
Oui, vous pouvez ignorer les cycles de construction (et leurs phases) et invoquer directement les objectifs (des plugins). Imaginez ce qui suit:
mvn compiler:compile
mvn compiler:testCompile
mvn surefire:test
mvn jar:jar
(REMARQUE: vous pouvez également appeler en ligne dans un seul appel)
Nous compilons ici le code de l'application, le code de test, l'exécution des tests et le package: imaginez à quel point cela serait manuel, source d'erreurs, répétitif et fastidieux. La convention sur la configuration nous aide: Maven introduit les cycles de vie de la construction et les phases . Le cycle de vie par défaut (sans nom, c'est-à-dire celui par défaut) fournit une série de phases basées sur les meilleures pratiques et conventions (le mantra de Maven).
Si vous voulez obtenir le même résultat que précédemment, lancez simplement: mvn package
et il compilera, testera et conditionnera automatiquement votre projet. Comment? invoquer des plugins. C'est-à-dire que les phases constituent un ensemble significatif et configurable d'exécutions de plugins (objectifs). Pour le rendre encore plus standard, Maven invoquera d’abord chaque phase précédente, de sorte que p. Ex. si vous voulez tester, vous serez sûr de compiler d’abord.
p.s. Notez que lorsque vous spécifiez plusieurs objectifs pour le même execution
, vous verrez toujours clairement dans le journal de construction deux exécutions différentes (avec le même identifiant) pour les deux objectifs différents (par conséquent, Tuple toujours unique).
Nous remercions Sandeep Jindal et Premraj (à partir d’ici Quels sont les objectifs et les phases Maven et quelle est leur différence? ). Leur explication m'aide à comprendre.
J'ai créé quelques exemples de code complets et quelques explications simples ici https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/ . Je pense que cela peut aider les autres à comprendre et peut essayer quelque chose directement.
En bref, du lien, vous ne devriez pas essayer de comprendre les trois en même temps, vous devez d’abord comprendre la relation entre ces groupes:
1. Cycle de vie vs phase
Cycle de vie est un ensemble de phases , voir ici - Références de cycle de vie . Lorsque vous appelez une phase , toutes les phases sont également appelées avant celle-ci. .
Par exemple, le cycle de vie propre comporte 3 phases (: pré-nettoyage, nettoyage, post-nettoyage ).
mvn clean
Il appellera pré-nettoyer et propre .
2. Plugin vs objectif
L'objectif est comme une action dans le plugin . Donc, si le plugin est une classe, goal est une méthode.
vous pouvez appeler un objectif comme ceci:
mvn clean:clean
Cela signifie "appeler le but propre, dans le plugin clean" (Rien ne se rapporte ici à la phase de nettoyage. Ne laissez pas la Parole "nettoyer" qui vous dérange, ils ne sont pas les mêmes! Voir l'explication complète dans mon lien ci-dessus)
3. Maintenant, la relation entre phase et objectif:
La phase peut (avant) être liée à But (s) .Par exemple , normalement, la phase de nettoyage est liée à l’objectif de nettoyage. Alors, quand vous appelez cette commande:
mvn clean
Il appellera la phase de pré-nettoyage et la phase de nettoyage qui est liée à l'objectif Nettoyer: nettoyer.
C'est presque pareil que:
mvn pre-clean clean:clean
Et tardivement un autre diagramme
Source: http://www.codetab.org/Apache-maven-tutorial/ , c'est vraiment un bon tutoriel
Les cycles de vie, les phases du cycle de vie, les plug-ins et les objectifs de plug-in sont au cœur de Maven.
Lorsque nous exécutons " package mvn" dans un projet Java, Maven lie les objectifs du plug-in aux phases du cycle de vie, comme indiqué dans la figure suivante.
Donc, pour expliquer un peu plus loin comme indiqué ici
Les constructions Maven sont divisées en cycles de vie, à savoir:
Chacun de ces cycles est divisé en phases. Par exemple, la construction est divisée en phases telles que:
Les phases ont des objectifs à exécuter avant avant - ou après après - une phase , par exemple:
Vous pouvez voir les objectifs sous forme de phases "insérées" supplémentaires si vous le souhaitez. Lisez ici ou jetez un oeil à @ réponse de Gerolds pour plus de détails.
LifeCycle vs Phases: Life Cycle
est une collection de phases
. Lorsque vous appelez une phase, toutes les phases précédentes sont également appelées. Maven est livré avec 3 cycles de vie de construction intégrés comme:
Le cycle de vie d'un nettoyage comporte 3 phases: pré-nettoyage, nettoyage et post-nettoyage. Les phases de cycle de vie par défaut et de site sont identiques à celles illustrées.