Maven--生命周期和插件(四)

13 篇文章 0 订阅

上几篇从应用角度来讲Maven,这篇还本着应用的精神继续讲解,Maven最好玩的地方不是单单的为你管理了jar这么简单,而是在他所定义的生命周期和插件下,玩多模块才是最有意思的,这篇大概讲一下生命周期和插件,下篇讲多模块依赖。

Maven的声明周期有三套,这里只说平时用到最核心的一套,也就是默认的声明周期,有以下几个重要的过程(其余忽略):

validate:验证项目正确性以及所必须信息的完整性。

initialize:初始化构建状态

generate-sources:产生所有的用来编译的源代码

process-sources:处理源代码

generate-resources:处理项目主资源文件。对src/main/resources目录的内容进行变量替换等工作后,复制到项目输出的主classpath目录中。

process-resources:复制并处理资源文件,至目标目录,准备打包。

compile:编译项目的源代码。

process-test-resources:复制并处理资源文件,至目标测试目录。

test-compile:编译测试源代码。

test:使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。

package:接受编译好的代码,打包成可发布的格式,如JAR。

install:将包安装至本地仓库,以让其它项目依赖。

deploy:将最终的包复制到远程的仓库,以让其它开发人员与项目共享。

Maven本身是一个插件框架,因此一系列的动作都要靠插件来完成,想玩Maven,必须对插件灵活运用,比如maven-compiler-plugin是用来编译的,每一个任务都是需要插件的一个目标(goal)来完成,那maven-compiler-plugin的compile目标就是用来编译位于src/main/java/目标下的源码,而testCompile是用来编译src/test/java目标下的测试源码。

Maven开发者提供了很多有用的插件,也提供用户自己开发插件。先说用法,插件有两种用法,一种是直接运行命令,另一种是和声明周期绑定,前者如mvnarchetype:generate,表示调用maven-archetype-plugin的generate目标,命令都是带冒号的;后者的具体用法如下:

那么如何来写一个插件呢?其实平时提供的这些插件基本够用,本人太懒,没有亲自写,但下面是一位网友写的内容,通俗易懂,我就拿来主义了。

所有的mojo都继承自org.apache.maven.plugin.AbstractMojo,我们来建立我们的maven插件工程:

[plain]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. mvn archetype:create -DgroupId=com.alibaba.maven.plugins -DartifactId=greeting-maven-plugin -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-mojo    

跟普通Maven的项目一样,自己定义groupId和artifactId。我们这里分别定义groupId为com.alibaba.maven.plugins和greeting-maven-plugin。

archetypeGroupId和archetypeArtifactId用来定位用哪个maven的工程模板来建立项目。当然我们使用的是maven-archetype-mojo模板来建立插件项目。

[java]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. /** @author admin  
  2. *   @goal sayHello   
  3. */     
  4. public class HelloWorldMojo extends AbstractMojo{    
  5.  @Override        
  6. public void execute() throws MojoExecutionException, MojoFailureException {     
  7.       getLog().info("Hello World!");        
  8. }}   

Ok,如上所示我们复写了execute方法,最重要@goal的一个annotation,它定义了这个mojo跟goal一一对应的关系。现在我们运行命令mvninstall把该插件先发布到本地库。之后我们便可以执行我们的插件了。

插件的运行方式为:mvngroupID:artifactID:version:goal

按照我们的项目,那么我们运行插件应该:mvncom.alibaba.maven.plugins:greeting-maven-plugin:1.0-SNAPSHOT:sayHello

看看,我们是不是已经在控制台看到我们打出的"HelloWorld"文字了。想想,为什么mvn eclipse:eclipse的插件运行方式可以这么简单。

怎么减少输入呢?首先,我们在maven的setting.xml配置文件中,可以找到这样一个配置项:

[html]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. <pluginGroups>    
  2.     <pluginGroup>*</pluginGroup>    
  3.   </pluginGroups>    

如果这里配置上我们的groupID,如我们的com.alibaba.maven.plugins,那么groupId的输入便可省略了。

另外,我们的项目名称DartifactId如果以${name}-maven-plugin或以maven-${name}-plugin的格式命名,我们便能省去-maven-plugin等信息。

version本来可以省略,maven会找到最新的版本来执行。

那么省略后的执行命令就可以这样写了:mvngreeting:sayHello

Ok,那么我要运行插件时输入参数,该怎么处理呢?如同mvn install -Dmaven.test.skip=true。我们重写我们的mojo,加入@parameter的annotation。如下

[java]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1.  /**   
  2. * @author admin   
  3. * @goal sayHello   
  4. */     
  5. public class HelloWorldMojo extends AbstractMojo{        
  6. /**       
  7. * @parameter default-value="Somebody" expression="${username}       
  8. */    
  9. private String userName;       
  10. @Override        
  11. public void execute() throws MojoExecutionException, MojoFailureException {    
  12.         getLog().info("Hello World!"+userName);        
  13. }}   

在install一把,然后运行mvngreeting:sayHello -Dusername=张三。这样就可以了。

其中一个比较重要的插件tomcat,实现项目的热部署:

http://stackoverflow.com/questions/13336816/tomcat7-maven-plugin-tomcatmanager-status-code403-reasonphraseforbbiden

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值