Maven自身指定定义了一套对项目进行编译,测试,打包,运行,部署等工作的抽象。Maven自己是不实际负责这些工作的,而是把它们交给了插件。所以Maven命令的实际工作执行者是各种各样的插件。

要了解Maven命令,还得知道Maven生命周期的概念。Maven有三套独立的生命周期:clean, default和site。每个生命周期又有不同的阶段。这三个生命周期之间是互相独立的,调用一个不会影响另一个。但是生命周期内部各个阶段之间却是有前后依赖关系:必须先执行前面的阶段,才可以执行下一阶段。

clean生命周期的目的是清理项目,包含三个阶段:

  • pre-clean:
  • clean:清理上一次构建生成的文件
  • post-clean:

  如果我现在要执行clean,那么必须先执行pre-clean。(只要告诉Maven你想要做的最后的目标就可以了,Maven会自动执行改目标之前的所有阶段)

default生命周期定义了真正构建时所需要执行的所有步骤,有如下阶段

  1. validate
  2. initialize
  3. generate-sources
  4. process-sources
  5. generate-resources
  6. process-resources
  7. compile
  8. process-classes
  9. generate-test-sources
  10. process-test-sources
  11. generate-test-resources
  12. process-test-resources
  13. test-compile
  14. process-test-classes
  15. test
  16. prepare-package
  17. package
  18. pre-integration-test
  19. integration-test
  20. post-integration-test
  21. verify
  22. install
  23. deploy

好吧,default生命周期多了一点,还是一样,如果想要执行deploy,那么Maven会自动把deploy前面所有的阶段都执行一遍,但是永远不会执行clean生命周期的任何东西。所以我们可以理解如这样的命令:

  mvn clean compile

意思是先执行到clean生命周期的clean阶段,再执行到default生命周期的compile阶段。

site生命周期的目的是建立和发布项目站点,有如下阶段

  1. pre-site
  2. site
  3. post-site
  4. site-deploy

执行maven命令的最主要的方式就是调用Maven的生命周期的阶段。再提一遍:Maven各个生命周期之间互相独立,而每个生命周期内部是有前后依赖关系的。

插件及其目标

  Maven的工作是插件完成的,插件自己也有自己的目的,并且还不是一个目的。以插件maven-dependency-plugin为例,它有十多个目标,如:dependency:list,dependency:analyze,dependency:tree等等。(这种写法是一种通用的写冒号前面是插件的前缀,后面是插件的目标)

Maven生命周期与插件目标互相绑定

  例如项目编译这个任务,对应maven default生命周期的compile阶段。而maven-compiler-plugin有一个目标compile能够完成这个任务。那么只要将他们绑定,就能够完成任务了。

  好了,那么我们应该执行命令: mvn compiler:compile来进行编译了。可是那样子得写一段比较长的命令。还好maven有一些内置绑定,我们直接写生命周期的某个阶段,maven自己知道要调用哪个插件,执行到哪个目标。如下的内置绑定:

  clean生命周期内只有一个阶段有绑定: clean阶段绑定了 maven-clean-plugin:clean。 那么我们写mvn clean时,maven才知道要调用maven-clean-plugin:clean

site生命周期有两个:site阶段绑定maven-site-plugin:site ;site-deploy阶段绑定maven-site-plugin:deploy

   default生命周期比较复杂,还要根据打包类型来决定绑定那个插件的那个目标。

 那么我们现在在回过头来再看命令 mvn clean deploy ,就会后更深的解释了:首先还是告诉maven,我要执行到clean阶段,那么maven会找内置绑定,发现clean是与 maven-clean-plugin:clean绑定的,那么maven就会调用maven-clean-plugin:clean;接下来告诉maven,我要执行到deploy阶段,还是一样,maven发现该阶段与maven-deploy-plugin:deploy绑定了,那么maven就会调用该插件了。

如果maven找不到绑定,那就会什么都不干。

如果你是个牛逼的程序员,觉得maven-clean-plugin这个插件写的太挫了,自己写了个插件,怎么使用呢?就是接下来的自定义绑定了。

自定义绑定

  先写个插件,那是必须的了。接下来在pom.xml文件中,build的子元素plugins中配置插件如下:

             <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.1</version>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>

意思是 verify阶段绑定到 maven-source-plugin:jar-no-fork目标。那么执行 mvn verify是就会执行 maven-source-plugin:jar-no-fork

命令行配置插件参数

  mvn test -Dmaven.test.skip=true

  记住 -Dxxx是java设置参数的方式。

到这里就该差不懂明白了,压根就不需要记住所谓的maven常用命令。 用mvn 阶段名 大体上能够满足编译,测试的要求。

但是为了简便,还是写一下:

mvn clean compile  编译

mvn clean test 测试

mvn clean package 打包

mvn clean install 把生成的jar/war包复制到本地repository(就是~/.m2/repository下面)

mvn clean deploy 把生成的jar/war包发送到远程repository(建议配置了私服,那就是往私服发送了)

mvn cargo:run 通过cargo插件,把生成的war包部署到本地服务器,并启动。(注意要先运行 mvn clean package 打包)

mvn cargo:redeploy 通过cargo插件,把生成的war包部署到远程服务器:如果已经有了,就先undeploy再deploy,如果没有直接deploy(注意要先运行 mvn clean package 打包,并且远程服务器是启动的)(怎么配置看Maven Cargo 远程不是到tomcat7x

最新文章

  1. SPFA 的两个优化
  2. JS闭包的两个使用方向
  3. 转载SSIS中的容器和数据流—数据转换(Transformations)续
  4. Storm拓扑的并行度(parallelism)介绍
  5. 循环checked表单 元素
  6. (三十九)数据的持久化存储-plist实现(XML属性表)
  7. python之路(7)装饰器
  8. Button按钮为什么无缘无故会提交form表单?
  9. 通过shell调用rtx接口
  10. 29)django-ORM连表结构
  11. 【POJ 2823】Sliding Window(单调队列/堆)
  12. WPF Blend 一个动画结束后另一个动画开始执行(一个一个执行)
  13. 一个Time TodoList实例了解redux在wepy中的使用
  14. 2017-2018-2 20155224『网络对抗技术』Exp4:恶意代码分析
  15. C#学习笔记(21)——C#获取文件夹下的所有文件的文件名
  16. Artech的MVC4框架学习——第七章Action的执行
  17. Microsoft SQL Server 2012 管理 (1): 安装配置SQL Server 重点
  18. Spring介绍及配置(XML文件配置和注解配置)
  19. 博弈---威佐夫博奕(Wythoff Game)
  20. IOS-CocoaPods进阶篇

热门文章

  1. 3.08课&#183;&#183;&#183;&#183;&#183;&#183;&#183;&#183;&#183;switch case及if else嵌套(日期格式)
  2. 【转】kalman滤波
  3. GDI+在绘制验证码中的使用
  4. [原创]java WEB学习笔记31:会话与状态管理 session机制 概述(定义,session机制,session的声明周期,保存session的方式,Session的创建与删除)
  5. keeplive使用
  6. Oracle的PL_SQL的结构
  7. 一个ClientDataset的Delta与XML相互转换
  8. C++(三)— 二维容器
  9. Java之泛型浅解
  10. codeforces 633D D. Fibonacci-ish(dfs+暴力+map)