Ich lerne gerade Maven und das mag offensichtlich sein, aber ich finde keine einfache Möglichkeit, die Ziele für die einzelnen Lebenszyklusphasen von Maven für ein bestimmtes Projekt aufzulisten.
Ich habe gesehen, dass die Maven-Standardlebenszyklusphasen und die entsprechenden Standardziele dokumentiert sind hier . Mein bisheriges Verständnis ist, dass jede pom.xml zusätzliche Ziele an jede Lebenszyklusphase binden kann.
Gibt es also einen MVN-Befehl, um die Ziele zu bestimmen, die für jede Lebenszyklusphase für ein bestimmtes Projekt ausgeführt werden? Wenn nicht, muss ich wohl nur die pom.xml nach jedem neuen Maven-Projekt durchsuchen, um das herauszufinden?
mvn help:describe -Dcmd=compile
(oder eine andere gültige Phase)
Das buildplan-maven-plugin
ist ein hervorragendes Werkzeug, um zu zeigen, wie Ziele an Phasen gebunden sind.
Unten finden Sie Beispiele für Befehle, die Sie ausführen können. Die Befehle laden das Plugin automatisch herunter und installieren es, falls es noch nicht installiert wurde.
> 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
Standardmäßig suchen die Ziele nach Aufgaben, die ausgeführt würden, wenn der Benutzer mvn deploy
Aufruft. Phasen wie clean
werden nicht berücksichtigt. Verwenden Sie die Eigenschaft buildplan.tasks
, Um mehrere Phasen in die Suche einzubeziehen:
> mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:list -Dbuildplan.tasks=clean,deploy
Ein Werkzeug, das hilft, ist mvn help:effective-pom
Der POM wird mit allen Variablen und allen erweiterten übergeordneten POMs gedruckt. Dies hilft zu verstehen, was Maven sieht. Daher ist es ziemlich einfach, alle zusätzlichen Ziele zu finden (die normalerweise nicht so viele sind).
Das größere Problem sind die impliziten Ziele (d. H. Wenn sich ein Plugin automatisch an einige Phasen des Lebenszyklus anschließt). Es gibt keine einfache Möglichkeit, diese zu sehen, ohne Maven auszuführen. Dies sollte in Maven 3 besser werden. Bis dahin starte Maven mit -X
, der eine Menge Debug-Ausgaben sowie die aktuelle Phase ausgibt und welche Plugins ausgeführt werden.
Ich habe Tschads Antwort in ein Skript geschrieben (damit ich mich nicht an den Namen des Plugins erinnern muss, der wirklich lang ist). Legen Sie es in Ihren Ordner ~/bin /, damit Sie es überall verwenden können.
#!/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;
Wenn nicht mit Maven, sondern mit m2e, können Sie dies mit dem Codeblock tun, den Sie in einem Eclipse-Plugin verwenden können:
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);
}
Schauen Sie sich die vollständige Quelle .
Bereits implementiert in:
http://marketplace.Eclipse.org/content/phases-and-goals
Es nutzt die Fähigkeit von m2e, die Zuordnung von Zielen zu Phasen zu berechnen. Ich versuche es auch auf Maven-Ebene zu lösen.