J'apprends juste Maven, et cela peut donc être évident, mais je ne trouve pas de moyen facile de répertorier les objectifs associés à chaque phase du cycle de vie de Maven pour un projet donné.
J'ai vu que les phases du cycle de vie par défaut de Maven et les objectifs par défaut correspondants sont documentés ici . Ma compréhension jusqu'à présent est que chaque pom.xml peut lier des objectifs supplémentaires à chaque phase du cycle de vie.
Existe-t-il donc une commande mvn pour déterminer les objectifs qui seront exécutés pour chaque phase du cycle de vie d'un projet donné? Sinon, je suppose que je n'ai qu'à parcourir le pom.xml pour chaque nouveau projet maven pour comprendre cela?
mvn help:describe -Dcmd=compile
(ou toute autre phase valide)
Le buildplan-maven-plugin
est un excellent outil pour montrer comment les objectifs sont liés aux phases.
Vous trouverez ci-dessous des exemples de commandes que vous pouvez exécuter. Les commandes téléchargeront et installeront automatiquement le plugin s'il n'a pas déjà été installé.
> mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:list
PLUGIN | PHASE | ID | GOAL
--------------------------------------------------------------------------------------------
maven-enforcer-plugin | validate | default | enforce
maven-dependency-plugin | process-sources | default | copy-dependencies
maven-resources-plugin | process-resources | default-resources | resources
maven-compiler-plugin | compile | default-compile | compile
maven-resources-plugin | process-test-resources | default-testResources | testResources
maven-compiler-plugin | test-compile | default-testCompile | testCompile
maven-surefire-plugin | test | default-test | test
maven-jar-plugin | package | default-jar | jar
maven-Assembly-plugin | package | make-Assembly | single
maven-install-plugin | install | default-install | install
maven-deploy-plugin | deploy | default-deploy | deploy
> mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:list-phase
validate -----------------------------------------------------------------
+ maven-enforcer-plugin | default | enforce
process-sources ----------------------------------------------------------
+ maven-dependency-plugin | default | copy-dependencies
process-resources --------------------------------------------------------
+ maven-resources-plugin | default-resources | resources
compile ------------------------------------------------------------------
+ maven-compiler-plugin | default-compile | compile
process-test-resources ---------------------------------------------------
+ maven-resources-plugin | default-testResources | testResources
test-compile -------------------------------------------------------------
+ maven-compiler-plugin | default-testCompile | testCompile
test ---------------------------------------------------------------------
+ maven-surefire-plugin | default-test | test
package ------------------------------------------------------------------
+ maven-jar-plugin | default-jar | jar
+ maven-Assembly-plugin | make-Assembly | single
install ------------------------------------------------------------------
+ maven-install-plugin | default-install | install
deploy -------------------------------------------------------------------
+ maven-deploy-plugin | default-deploy | deploy
> mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:list-plugin
maven-enforcer-plugin ---------------------------------------------------
+ validate | default | enforce
maven-dependency-plugin -------------------------------------------------
+ process-sources | default | copy-dependencies
maven-resources-plugin --------------------------------------------------
+ process-resources | default-resources | resources
+ process-test-resources | default-testResources | testResources
maven-compiler-plugin ---------------------------------------------------
+ compile | default-compile | compile
+ test-compile | default-testCompile | testCompile
maven-surefire-plugin ---------------------------------------------------
+ test | default-test | test
maven-jar-plugin --------------------------------------------------------
+ package | default-jar | jar
maven-Assembly-plugin ---------------------------------------------------
+ package | make-Assembly | single
maven-install-plugin ----------------------------------------------------
+ install | default-install | install
maven-deploy-plugin -----------------------------------------------------
+ deploy | default-deploy | deploy
Par défaut, les objectifs recherchent les tâches qui s'exécuteraient si l'utilisateur invoquait mvn deploy
. Les phases telles que clean
ne seront pas incluses. Pour inclure plusieurs phases dans la recherche, utilisez le buildplan.tasks
propriété:
> mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:list -Dbuildplan.tasks=clean,deploy
Un outil qui aide est mvn help:effective-pom
Il imprimera le POM avec toutes les variables et tous les POM parents développés. Cela aide à comprendre ce que voit Maven. De là, il est assez simple de trouver tous les objectifs supplémentaires (qui ne sont généralement pas si nombreux).
Le plus gros problème est les objectifs implicites (c'est-à-dire lorsqu'un plugin se connecte automatiquement à certaines phases du cycle de vie). Il n'y a pas de moyen facile de les voir sans exécuter Maven. Cela devrait s'améliorer dans Maven 3. Jusque-là, exécutez Maven avec -X
qui affichera beaucoup de sortie de débogage plus la phase actuelle et quels plugins sont exécutés.
J'ai mis la réponse de Chad dans un script (donc je n'ai pas à me souvenir du nom du plugin qui est vraiment long). Mettez-le dans votre dossier ~/bin/afin de pouvoir l'utiliser n'importe où.
#!/usr/bin/env bash
# Created based on https://stackoverflow.com/a/35610377/529256
debug=false
goal='list-phase'
build_plan='clean,deploy'
working_directories=""
for (( i=1; i<=$#; i++ )) do
case ${!i} in
-h|--help)
programName=$( basename ${0} )
echo "Lists the goals of mvn project(s) by phase in a table";
echo
echo "Usage:";
echo " ${programName} -d|--debug -g|--goal goal -b|--build_plan build_plan [*directory]";
echo
echo " --goal The goal for the buildplan-maven-plugin (default: $goal)"
echo " (possible values: list, list-plugin, list-phase)"
echo
echo " --build_plan The value of the buildplan.tasks parameter (default: $build_plan)"
echo " (examples: 'clean,install', 'deploy', 'install', etc...) "
echo
echo " [*directory] The directories (with pom.xml files) to run the command in"
exit 0;
;;
-d|--debug)
debug=true;
echo "debug = ${debug}";
;;
-b|--build_plan)
((i++))
build_plan="${!i}"
;;
-g|--goal)
((i++))
goal="${!i}"
;;
*)
working_directory="${!i}";
if [ ! -e "${working_directory}" ]; then
echo "'${working_directory}' doesn't exist";
exit 1;
fi;
if [ -z "${working_directories}" ]; then
working_directories="$working_directory"
else
working_directories="$working_directories ${!i}"
fi;
;;
esac;
done;
if [ -z "${working_directories}" ]; then
working_directories="$PWD"
fi
if [ ${debug} = true ]; then
echo "working_directories=$working_directories"
echo "goal=$goal"
echo "build_plan=$build_plan"
fi
for workingDirectory in ${working_directories}; do
pushd ${workingDirectory} > /dev/null
echo "cd $workingDirectory"
echo "mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:${goal} -Dbuildplan.tasks=${build_plan}"
mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:${goal} -Dbuildplan.tasks=${build_plan}
popd > /dev/null
done;
Si ce n'est pas avec Maven mais en utilisant m2e, vous pouvez le faire en utilisant le bloc de code que vous pouvez utiliser dans un plugin Eclipse:
final IMavenProjectRegistry projectRegistry = MavenPlugin.getMavenProjectRegistry();
final IMavenProjectFacade facade = projectRegistry.getProject(project);
projectRegistry.execute(facade, new ICallable<Void>() {
public Void call(IMavenExecutionContext context, IProgressMonitor monitor) throws CoreException {
MavenProject mavenProject = facade.getMavenProject(monitor);
List<MojoExecution> mojoExecutions = ((MavenProjectFacade) facade).getMojoExecutions(monitor);
LifecycleMappingResult mappingResult = LifecycleMappingFactory.calculateLifecycleMapping(
mavenProject, mojoExecutions, facade.getResolverConfiguration().getLifecycleMappingId(),
monitor);
Map<MojoExecutionKey, List<IPluginExecutionMetadata>> mojoExecutionMapping = mappingResult
.getMojoExecutionMapping();
Map<String, List<MojoExecutionKey>> phases = new LinkedHashMap<String, List<MojoExecutionKey>>();
for (MojoExecutionKey execution : mojoExecutionMapping.keySet()) {
List<MojoExecutionKey> executions = phases.get(execution.getLifecyclePhase());
if (executions == null) {
executions = new ArrayList<MojoExecutionKey>();
phases.put(execution.getLifecyclePhase(), executions);
}
executions.add(execution);
}
Regardez plein source .
Déjà implémenté dans:
http://marketplace.Eclipse.org/content/phases-and-goals
Il utilise la capacité de m2e à calculer l'association des objectifs avec les phases. J'essaie également de le résoudre au niveau maven.