maven基础知识

来源:互联网 发布:阿里云个人域名备案 编辑:程序博客网 时间:2024/05/22 05:07

本文假设你已经在本地电脑安装了maven。

参考资料:

http://www.sonatype.com/books/mvnref-book/reference/public-book.html

 Maven的用途

maven是一个自动化构建工具。C语言中有make工具(configure, make, make install三部曲),Java语言中,最早有ant工具,之后发展出了maven,相似的构建工具有:ivy(和ant集成)、Gradle(基于Groovy)

这些构建工具会帮助你完成以下工作:编译、单元测试、打包、发布到包仓库、生成javadoc、生成报告(单元测试覆盖率、代码静态检查结果等)、部署到远程服务器。

 Maven是一套标准,基于一个通用的软件对象模型(Project Object Model)提供一系列工具(插件Plug-in),方便描述和管理项目

Maven的基本概念 

  • POM

项目描述文件,Maven管理项目的依据(pom.xml)

  • Lifecycle和phase

maven的核心模型。生命周期模型,定义了工程从编译到发布的各个过程。

  • Goal

mvn的命令行参数的一种,告诉maven要用插件完成什么任务。

mvn archetype:create
  • dependency

用于定义maven工程所依赖的包(包的标识是用GAV来区分的),例如:

<dependency>
           <groupId>log4j</groupId>
           <artifactId>log4j</artifactId>
           <version>1.2.14</version>
  </dependency>
  • profile

用于定义各种特定的配置,例如,我们的源代码通常会针对开发环境、测试环境、生产环境有不同的构建方式。

  • Plug-in

maven通过插件来扩展它的功能。

  • GAV

GroupId, ArtifactId 和Version 一个maven工程的唯一标识。

在命令行下输入:mvn --help,会看到maven命令的提示。其中:

usage: mvn [options] [<goal(s)>] [<phase(s)>]

表示了maven命令的基本格式。maven命令是由:选项、一个或多个Goal、一个或多个phase,组成。多个goals或phases之间用空格分隔。

 Goal的表示方法是:插件名:goal

例如:mvn javadoc:javadoc 表示执行javadoc插件的javadoc目标。效果是生成javadoc。

当你在命令中输入某个phase后,maven将执行该phase所属的lifecycle内,之前的所有phase。例如:

test属于Default Lifecycle,在这个阶段会执行单元测试,它之前有这些phase:process-test-resources, test-compile, process-test-classes

那么当你执行 mvn test命令时,maven会依次执行上述的几个phase,然后才会执行到test。

而clean这个phase属于Clean Lifecycle,因此它不会被执行到。如果你想在单元测试前clean一下,那么命令应该是:

mvn clean test  

 了解以上概念后,你就完全可以参考已有的maven工程(开源项目中很多都用的maven),以及maven官方的资料来构建自己的应用了。

Maven实践

怎么创建一个maven工程?

使用maven可以基于已有的工程模板来创建maven工程(就如同我们使用eclipse时,新建工程也是基于Eclipse提供的一些工程模板)。

在Maven使用指南 中,说明了如何使用默认的工程模板来创建maven工程。基于maven的这一功能,为了提高开发人员搭建代码框架的效率,我们可以自制一些工程模板供开发人员使用。

 使用上述方式构建出来的maven工程,

src/main/java为源代码目录

src/main/resources为源代码的类路径,用于放置配置文件

src/test/java为单元测试代码目录

src/test/resources为单元测试代码的类路径,用于放置单元测试时需要的配置文件,打包时,这个路径下的文件不会打入包中

怎么使用maven管理多个工程?

通常我们的代码会由多个模块组成,之前通过依赖关系整合在一起(关于多模块,可以看一下Spring或hibernate的源代码)。

对于这个问题,大家只需要了解maven工程中有个父子工程的概念(当然,不一定只能是两级,可以是多级,换句话说可以有孙子工程、重孙子工程(微笑) ) 
注意以下几点即可:

  • 在父工程下执行的构建任务,子工程也会依次执行(所谓依次是指按modules中配置的顺序)
  • 父工程的packaging类型必须是pom(相关知识可以看一下pom.xml的说明),即父工程的pom.xml中:
    <packaging>pom</packaging>
  • 父工程中modules节点中的<module>节点描述它的子工程,在module节点内通过子工程的相对路径(相对父POM的路径)来定位子工程的位置。
  • 父子工程是继承的关系,表现如下:

    1) 父工程中,dependencies节点定义的依赖的包同时也被子工程依赖。

    2) 父工程中,plugins节点定义的插件,同时也被子工程使用。

    我们有时并不需要这样的继承关系,那么你可以:

    1)通过dependencyManagement节点,来管理子工程所依赖的包的版本。

    2)通过pluginManagement节点,来管理子工程所使用的插件的版本。

怎样使用maven插件

参考:如何使用Maven插件

怎样深入学习maven的使用?

最快的学习方法是看开源项目的pom.xml是怎么配置的。

只想了解某个插件的使用方法,或是某个功能的配置方法,最好查看:

官方的参考资料:http://maven.apache.org/

想系统的学习maven,或者系统的了解某方面的使用,最好查看:

maven手册:http://www.sonatype.com/books/mvnref-book/reference/public-book.html

0 0
原创粉丝点击