一、问题发生
我想使用IDEA的Maven管理工具将项目安装到本地仓库,于是选择了Plugins下的install:install去执行,如下图所示:结果出现了如下报错信信息:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-install-plugin:2.4:install (default-cli) on project test: The packaging for this project did not assign a file to the build artifact -> [Help 1]>
二、问题解决
因问题分析比较长,怕没耐心看完。故将解决方案放在前边方法一:使用Maven管理工具下的LifeCycle(生命周期)中的install,如下图所示 。网上也可以搜到这种解决方法,但是他的说法,“使用Lifecycle中的install,项目就会自动去maven仓库下载需要的包”是错误的。
方法二:使用Maven管理工具 工具栏中的Execute Maven Goal,如下图所示
点击打开,输入Maven命令,特殊说明:在windows的cmd中执行命令,需要在最前面加上mvn,而在这里不需要,如下图所示:
三、问题分析
解决问题很简单,知道问题为什么产生确不容易。然而这也是最重要的,要知其然更要知其所以然。通过下文,你可以了解到Maven的生命周期、阶段、插件和目标之间的关系,弄清楚关系之后,就可以明白,解决方案一和二的原理,并可以提出新的解决方案。OK,废话不多说,进入正文。————————————————进入正文—————————————————
1、生命周期(lifecycle)
Maven的生命周期就是对所有的构建过程进行抽象和统一。包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有的构建步骤。Maven 内置的三套生命周期:
(1) clean 清理项目
(2) default 构建、发布项目
(3) site 生成项目站点
2、阶段(phase)
阶段是生命周期的组成部分。特点:阶段在生命周期内具有顺序性,在执行生命周期中某个阶段时会先顺序执行本周期当前阶段之前的所有阶段,再执行当前阶段。例如:clean周期共有3个阶段,按顺序分别如下:
pre-cleancleanpost-clean
当执行命令mvn clean
时,实际按顺序执行了clean生命周期的pre-clean和clean共2个阶段。
3、插件(plugin)和目标(goal)
阶段的执行依赖插件和目标。(对于这句话看个人理解,不太好翻译,官方原话:A Build Phase is Made Up of Plugin Goals)插件从本质上来说插件j是打成jar包的java程序,目标应该是程序的参数。
插件可以单独执行 例如 :
插件目标表示一个特定的任务,阶段负责生命周期中的特定步骤,它执行职责的方式可能不同。有些阶段声明绑定的插件目标,即通过执行相应目标的方式履行职责,有些阶段没有声明绑定的插件目标,,通过其他方式履行职责。
生命周期及其包含阶段,阶段声明绑定的插件目标见下表
(1)生命周期clean(3个阶段)
(2)生命周期default(23个阶段)
(3)生命周期site(4个阶段)
4、总论
在IDEA中使用Lifecycle下的install(即在命令行下执行命令mvn install
),mvn install
代表执行的是生命周期的一个阶段,由上文知,在执行install阶段先要执行其前面的21个阶段,之后执行install阶段(install阶段的执行依赖插件目标install:install)
在IDEA中使用Plugins下的install:install(即在命令行下执行命令mvninstall:install
)mvn install:install
代表执行的是插件的目标,它单独执行,不会先去执行之前的21个阶段。
因此使用方案一可以解决问题。
又因为生命周期可以和插件目标一起执行,所以先执行verify生命周期阶段,在执行install:install插件,这样同样都是执行22个阶段了。
因此使用方法二可以解决问题。