Maven命令列出生命周期阶段以及绑定目标?
Posted
技术标签:
【中文标题】Maven命令列出生命周期阶段以及绑定目标?【英文标题】:Maven command to list lifecycle phases along with bound goals? 【发布时间】:2010-12-15 03:24:55 【问题描述】:我只是在学习 Maven,所以这可能很明显,但我找不到一种简单的方法来列出给定项目的每个 maven 生命周期阶段相关的目标。
我看到 Maven 默认生命周期阶段和相应的默认目标记录在 here 中。到目前为止,我的理解是每个 pom.xml 都可以将其他目标绑定到每个生命周期阶段。
那么,是否有一个 mvn 命令来确定将在给定项目的每个生命周期阶段运行的目标?如果没有,我想我只需要查看每个新的 maven 项目的 pom.xml 就可以解决这个问题?
【问题讨论】:
【参考方案1】:我把 Chad 的答案写进了一个脚本(这样我就不用记住很长的插件名称了)。把它放在你的 ~/bin/ 文件夹中,这样你就可以在任何地方使用它了。
#!/usr/bin/env bash
# Created based on https://***.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;
【讨论】:
【参考方案2】:buildplan-maven-plugin
是显示目标如何与阶段绑定的出色工具。
以下是您可以运行的命令示例。如果插件尚未安装,这些命令将自动下载并安装插件。
按执行顺序列出目标
> 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
注意事项
默认情况下,目标搜索在用户调用mvn deploy
时将运行的任务。不包括诸如clean
之类的阶段。要在搜索中包含多个阶段,请使用 buildplan.tasks
属性:
> mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:list -Dbuildplan.tasks=clean,deploy
【讨论】:
这确实应该默认内置在 Maven 中。 也可以在不调整 pom 的情况下工作:mvn fr.jcgay.maven.plugins:buildplan-maven-plugin:list -Dbuildplan.tasks=clean,install,deploy
如果从 FibreFoX 的评论开始,这个答案将是完美的。
我认为这个答案比公认的答案要好得多。
我同意@Ianoxx 的观点,即默认情况下应该将其添加到 Maven 中。很棒的插件!【参考方案3】:
如果不是使用 Maven 而是使用 m2e,您可以使用可以在 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);
查看完整的source。
已经在:
http://marketplace.eclipse.org/content/phases-and-goals
它利用 m2e 的能力来计算目标与阶段的关联。我也在尝试在 Maven 级别解决它。
【讨论】:
请不要仅发布链接答案【参考方案4】:mvn help:describe -Dcmd=compile
(或任何其他有效阶段)
【讨论】:
在此命令的输出中看不到绑定到阶段的目标。相反,我看到的是插件/阶段。 Mabye 我理解错了这个问题,但这个命令是对问题的“反向查找”(列出这个目标所在的所有阶段)? link 说 “显示 Maven 插件和/或目标(又名 Mojo - Maven 普通旧 Java 对象)的属性列表。”【参考方案5】:一个有帮助的工具是mvn help:effective-pom
它将打印带有所有变量和所有父 POM 扩展的 POM。这有助于理解 Maven 所看到的。由此,很容易找到所有额外的目标(通常不会那么多)。
更大的问题是隐含的目标(即当插件自动挂钩到生命周期的某些阶段时)。如果不实际运行 Maven,就很难看到这些。这在 Maven 3 中应该会变得更好。在此之前,使用 -X
运行 Maven,这将打印大量调试输出以及当前阶段以及执行的插件。
【讨论】:
谢谢,Aaron,这很有帮助! 如何在 Maven 3 中变得更好?是在当前的 alpha-6 中吗? Jason 告诉我,新的 Maven 3 将在实际启动之前构建整个构建的模型。这意味着您可以在不运行命令的情况下检查(并打印)挂钩。 有效的 pom 应该显示当前没有这样做的每个目标的实际绑定阶段...叹息..以上是关于Maven命令列出生命周期阶段以及绑定目标?的主要内容,如果未能解决你的问题,请参考以下文章
Maven:将插件执行绑定到另一个插件的执行,而不是生命周期阶段