天天看点

maven使用总结(一)什么是maven?为什么用maven:如何使用maven:

开发过程中一直在使用mavne,本着学习的态度,还是好好总结总结。

什么是maven?

  • Maven这个词可以翻译为“知识的积累”,也可以翻译为“专家”或“内行”。但是这样解释好像还是不能说明maven这个词。当然maven也不是一句话就能说清楚的。或许我们可以通过maven的作用来进一步的了解maven——“Maven主要服务于基于Java平 台的项目构建、依赖管理和项目信息管理”这句话很基本涵盖了maven的主要功能。但要想真正的了解maven还是要详细的了解它的强大作用。

为什么用maven:

优秀的构件工具:

  • maven是优秀的异常强大的构建工具,能够帮我们自动化构建过程,从清理、编译、测试到生成报告,再到打包和部署。我们不需要也不应该一遍又一遍地输入命令,一次又一次地点击鼠标,我们要做的是 使用Maven配置好项目,然后输入简单的命令(如mvn clean install),Maven会帮我们处理那些烦琐的任务。

方便的管理项目依赖:

  • Maven不仅是构建工具,还是一个依赖管理工具和项目信息管理工具。 它提供了中央仓库,能帮我们自动下载构件。
  • 在这个开源的年代里,几乎任何Java应用都会借用一些第三方的开源类库,这些 类库都可通过依赖的方式引入到项目中来。随着依赖的增多,版本不一致、版本冲突、依赖臃肿等问题都会接踵而来。手工解决这些问题是十分枯燥的,幸运的是 Maven提供了一个优秀的解决方案,它通过一个坐标系统准确地定位每一个构件(artifact),也就是通过一组坐标Maven能够找到任何一个 Java类库(如jar文件)。Maven给这个类库世界引入了经纬,让它们变得有秩序,于是我们可以借助它来有序地管理依赖,轻松地解决那些繁杂的依赖问题。
  • 坐标是Maven构件的唯一标识。坐标由groupId、artifactId、version、packaging、classifier构成。
    1. groupId:组织的实际项目名,建议使用组织的域名反向+项目名称,如org.apache.maven.plugins。
    2. artifactId:Maven项目(模块)名,建议使用实际项目名作为模块的前缀,如maven-compiler-plugin。
    3. version:Maven项目的版本。版本号约定为<主版本>.<次版本>.<增量版本>-<里程碑版本>,如1.2.3-beta-1。Maven还定义了SNAPSHOT快照版本,用于持续更新发布。
    4. packaging:Maven项目的打包方式,通常与生成的构件的扩展名对应,如jar,war。默认为jar。
    5. classifier:用于帮助定义构建输出的一些附属构件。常见的使用场景如针对不同JDK版本(如jdk5)。
  • 坐标的5个元素中,groupId、artifactId、version是必须指定的,packaging可选(默认为jar),classifier是不能直接定义的(由辅助的插件帮助生成)。
  • Maven构建出的文件的文件名一般为:artifactId-version[-classifier].packaging

统一的管理项目信息:

  • Maven还能帮助我们管理原本分散在项目中各个角落的项目信息,包括项目描述、开发者列表、版本控制系统地址、许可证、缺陷管理系统地址等。这些微小的变化看起来很琐碎,并不起眼,但却在不知不觉中为我们节省了大量寻找信息的时间。除了直接的项目信息,通过Maven自动生成的站点,以及一些已有的插件,我们还能够轻松获得项目文档、测试报告、静态分析报告、源码版本日志报告等非常具有价值的项目信息。

如何使用maven:

使用maven其实就是对maven优点的利用:

  • 对于构件(生命周期与插件): Maven的生命周期就是为了对所有的构建过程进行抽象和统一。Maven从大量项目和构建工具中学习和反思,然后总结了一套高度完善的、易扩展的生命周期。这个生命周期包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有构建步骤。也就是说,几乎所有项目的构建,都能映射到这样一个生命周期上。
  • Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,在Maven的设计中,实际的任务(如编译源代码)都交由插件来完成。这种思想与设计模式中的模板方法(Template Method)非常相似。模板方法模式在父类中定义算法的整体结构,子类通过实现或者重新父类的方法来控制实际的行为。这样既保证了算法有足够的可扩展性,又能够严格控制算法的整体结构。
  • 每个构建步骤都可以绑定一个或者多个插件行为,而Maven为大多数构建步骤编写并绑定了默认插件。当用户有特殊需要的时候,也可以配置插件定制构建行为,甚至自己编写插件。

三套生命周期:

  • Maven拥有三套互相独立的生命周期,它们分别是clean、default和site。clean生命周期的目的是清理项目,default生命周期的目的是构建项目,而site生命周期的目的是建立项目站点。
  • 每个生命周期包含一些阶段,这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段,用户和Maven最直接的交互方式就是调用这些生命周期阶段。较之于生命周期阶段的前后依赖关系,三套生命周期本身是相互独立的。

(1)Clean生命周期:

  • clean生命周期的目的是清理项目,它包含三个阶段:
    • pre-clean:执行一些清理前需要完成的工作
    • clean:清理上一次构建生成的文件
    • post-clean:执行一些清理后需要完成的工作

(2)default生命周期:

  • validate
  • initialize
  • generate-source
  • process-sources:处理项目主资源文件。一般来说,是对 src/main/resource目录的内容进行变量替换等工作后,复制到项目输出的主classpath目录中。
  • generate-resources
  • process-resources
  • compile:编译项目的源代码,一般来说,是编译src/main/java目录下的Java文件至项目输出的主classpath目录中
  • process-classes
  • generate-test-sources
  • process-test-sources:处理项目测试资源文件。一般来说,是对src/test/resource目录的内容进行变量替换等工作后,复制到项目输出的主classpath目录中。
  • generate-test-resources
  • process-test-resources
  • test-compile:编译项目的测试代码。一般来说,是编译src/test/java目录下的Java文件至项目输出的测试classpath目录中
  • process-test-classes
  • test:使用单元测试框架运行测试,测试代码不会被打包或部署
  • prepare-package
  • package:接受编译好的代码,打包成可发布的版本,如JAR
  • pre-integration-test
  • integration-test
  • post-integration-test
  • verify
  • install:将包安装到Maven本地仓库,供本地其他Maven项目使用
  • deploy:将最终的包复制到远程仓库,供其他开发人员和Maven项目使用

    (对于本地仓库和远程仓库的概念会在后面介绍)

(3)site生命周期:

  • site生命周期的目的是建立和发布项目站点,Maven能够基于POM所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息。该生命周期包含如下阶段:
    • pre-site:执行一些在生成项目站点之前需要完成的工作
    • site:生成项目站点文档
    • post-site:执行一些在生成项目站点之后需要完成的工作
    • site-deploy:将生成的项目站点发布到服务器上

命令行与生命周期:

  • 从命令行执行Maven的最主要的方式就是调用Maven的生命期阶段。需要注意的是,各个生命周期是相互独立的,而一个生命周期的阶段是有前后依赖关系的,比如你如果使用mvn clean install命令首先调用clean生命周期的pre-clean、clean阶段,然后调用default生命周期的从validate至install的所有阶段,改命令结合了两个生命周期。

    其他的也是一样。

插件的目标:

  • 对于插件本身,为了能够复用代码,它往往能够完成多个任务。例如maven-dependency-plugin,它能够基于项目依赖做很多事情。它能够分析项目依赖,帮助找出潜在的无用依赖;它能够列出项目的依赖树,帮助分析依赖来源;它能够列出项目所有已解析的依赖,等等。为每个这样的功能编写一个独立的插件显然是不可取的,因为这些任务背后有很多可以复用的代码,因此,这些功能聚集在一个插件里,每个功能就是一个插件目标。
  • maven-dependency-plugin有十多个目标,每个目标对应了一个功能,上诉提到的几个功能分别对应的插件目标为dependency:analyze、dependency:tree和dependency:list。

继续阅读