maven基础学习

一、概述
  POM是Project Object Model的缩写,项目的属性、依赖、构建配置这些信息都被抽象到项目对象模型里面。
  POM分为四个模块:项目基本信息、构建环境、POM关系管理、构建配置。

  1. 项目基本信息包括项目的名称、项目的官网、发起组织、项目的开发者、贡献者列表和许可证信息等等,通过这些信息我们可以对项目有一个基本的了解
  2. 构建环境包含了一些能在不同使用环境中激活的profile,比如,在开发过程中需要将系统部署到开发环境上,此时用的配置就是开发用的数据库和缓存系统等,而系统上线后,系统将部署到生产环境中,此时用的就是生产环境的数据库和缓存系统了。构建环境为特定的环境定制了构建设置,可以将不同的环境分开管理,非常方便。
  3. POM关系:通过POM可以引入当前项目依赖的其他项目,也可以设置所继承的父级项目或者它包含的子项目,另外还可以设置自身的项目坐标等。
  4. 构建设置:通过构建设置可以修改maven的默认行为,比如说修改源码或者测试代码的存放位置,添加新的插件或者把插件的目标反映到生命周期上,另外还可以定义站点生成参数等

二、POM文件

  项目的所有信息都被抽象到了POM中,都被保存在一个POM.xml文件。
  项目的坐标:
    groupId:默认情况下,生成的报名和groupId一样
    artifactId:默认情况下,生成的项目名称和artifactId对应
    packageing:指定打包类型,可以使jar或者war
    version:定义项目的版本
  子项目的pom会继承父级项目的pom.
  可以通过mvn help:effective-pom查看当前项目使用的完整pom(其中包含了从父级pom继承的元素)

三、插件与目标

  maven本身是一个框架,实际的任务都是由插件来完成的,一个目标是一个工作单元,而插件是多个目标的集合。

  生成项目骨架的命令:mvn archetype:generate

  在该命令中archetype是maven-archetype-plugins插件,generate是archetype中其中的一个目标(goal)
  使用语法是:
    groupId:groupId

  maven所有的任务都是交给插件去完成的,调用插件目标的两种方式:
  1.将插件与生命周期绑定,即通过指定生命周期阶段,就能隐式的通过插件执行任务.
  2.直接执行插件目标

四、maven常用的插件

  1.maven-archetype-plugins,用来快速生成项目骨架,
    生成项目骨架的命令:mvn archetype:generate. 这个是交互式的过程,需要在过程中让用户指定groupId,artifactId,packaging和version等信息。
    对应的有个非交互式的命令: mvn archetype:create -DgroupId=com.elvis -Dartifactid=study

  2.maven-dependeny-plugin,帮助分析项目依赖.
    list目标: 用来列出当前项目的依赖列表.
    analysis目标: 列出项目依赖潜在的问题,如果项目中有未声明的依赖,该目标就会发出警告.

  3.maven-help-plugin,辅助工具
    system目标,能够打印所有的环境变量和java系统属性;
    effective-pom目标,打印项目的有效pom,有效的pom是指合并了所有的父pom之后的pom,当不确定pom的信息从何而来的时候就可以通过这个goal查看和确认.
    effective-settings目标,打印项目的有效的settings,当发现配置的setting没有生效时,就可以通过effective-settings来进行验证
    describe目标:可以帮助描述任何一个maven插件的信息,当要查看某个目标的帮助信息时,就可以通过这个goal来查看.

  4.maven-resources-plugin 可以为项目提供更加清晰的项目结构,可以独立管理java代码文件和资源文件,默认的主资源目录是resources目录,可以通过设置这个插件的选项来配置resources目录,使用这个插件还可以实现对资源文件的过滤。

  5.maven-surefire-plugin,用来进行单元测试。

  6.jetty-maven-plugin

  7.maven-enforcer-plugin

  maven提供了很多的实用插件,除了上述的常用插件外,可以到官网查看更多的插件
  http://maven.apache.org/plugins/index.html
  http://mojo.codehaus.org/plugins.html

五、项目的生命周期阶段

  maven中项目的生命周期是指项目的构建过程,它包含了一系列的有序的阶段,而一个阶段就是构建过程中的一个步骤。

简化的maven项目生命周期


资源文件处理-->编译-->类文件处理-->测试资源处理-->测试-->打包。


对于不同的项目而言,相同的生命周期阶段,所做的事情也是不一样的,就拿打包这个阶段来说,在一个项目里可能是将项目打包成jar文件,而在另外一个项目里则可能是将项目打包成war文件,这依赖于项目的具体配置。

插件目标可以绑定到生命周期阶段上。一个生命周期阶段可以绑定多个插件目标。随着maven声明周期阶段的移动,他会执行附着在项目周期上的目标。每个阶段可以不绑定目标,也可以绑定多个目标。

maven执行一个声明周期阶段的时候,它首先会有序的执行这个阶段前面的所有阶段,直到命令行指定的那个阶段为止。每个阶段对应着0个或者多个目标,如果不进行任何插件的定制或者配置,那么项目就会绑定标准的插件目标到默认的生命周期。

例如mvn package的执行流程如下:

1.执行resources插件的resources目标,该目标绑定的是resources阶段,这个目标会将resources目录下的所有资源和文件,以及其他自定义目录下的资源和文件复制到输出目录。

2.执行compiler插件的compile目标,该目标绑定的是compile阶段,这个目标会编译java目录下的所有源代码以及其他自定义目录下的源代码,然后复制到输出目录。

3.执行resources插件的testResources目标,该目标绑定的是testResources阶段,和上面的类似只不过处理的是测试用的资源文件。

4.执行compiler插件的testCompile目标,该目标绑定的是testCompile阶段,和上面的类似只不过处理的是测试用的源码文件。

5.执行surefire插件的test目标,该目标绑定的是test阶段,用来执行单元测试。

6.执行jar插件的jar目标,该目标绑定的是package阶段,这个目标会将输出目录打包成jar文件。

六、maven的依赖

所谓依赖就是一个项目正常运行所需要的第三方类库文件,这些类库文件在maven中称为依赖或者也称为构件。
<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>3.8.1</version>
    <scope>test</scope>
  </dependency>
</dependencies>

maven支持传递性依赖:
  一个复杂的项目将会包含很多依赖,也有可能包含依赖于其他构件的依赖.你不必找出所有这些依赖然后把它们写到pom文件中,你只需要加上你直接依赖的那些库,maven会隐式的把这些库间接依赖的库也加入到你的项目中,并且还会自动处理依赖的冲突。

依赖的范围:在依赖的定义中,有一个字段叫做scope,这就是依赖的范围。

  compile: 编译范围,默认的范围,如果不提供scope,那就是这个scope。处于这个范围的依赖在所有的classpath中都是可用的。同时他们也会被打包

  provided: 已提供范围,只有当jdk或者一个容器已经提供依赖之后才会使用,比如说你开发了一个web应用,你可能在编译的classpath中需要servelet API来编译一个servlet,但是你不需要在打包后的war文件中不需要包含这个servlet API,因为这个servlet API所在的jar文件已经由你的应用服务器或者web容器来提供了。这个时候就可以将依赖范围设置为provided,他只在编译的时候有效,而不会打包到war文件中.

  runtime: 运行时范围,表示运行时范围,在运行或者测试系统的时候需要,但是在编译的时候不需要。

  test: 测试范围,在一般编译和运行的时候都不需要,他们只在测试编译或者测试运行的时候才可用.比如Junit。

  system: 系统范围,与provided类似,但是你必须显示的提供一个与本地系统中jar文件的路径,这个取值范围在实际开发中不常用。

七、Maven仓库

Maven仓库就是一个存放了所有依赖的仓库,这个仓库通过依赖的坐标对其进行管理。

1. 本地仓库: 在运行maven项目时,maven所有的依赖都是直接从本地仓库来获取的,如果本地仓库没有,他会先尝试从远程仓库下载依赖到本地仓库,然后再使用本地仓库的依赖。如果本地仓库和远程仓库都找不到依赖,maven就会报错。
    /user/.m2是maven默认的本地仓库的位置,在windows中默认是在C盘,不安全,所以使用windows系统的时候通常都要修改本地仓库的位置为其他盘.

  

如何修改本地仓库的位置?
    打开maven安装目录/conf/settings.xml,找到localRepository的位置,取消注释(默认是被注释掉的),然后将路径修改成将要使用的路径就可以了。

当运行mvn install的时候maven其实是将项目生成的构件安装到了本地仓库,也就是说,只有install之后,其他项目才能使用此项目生成的构件.

2. 远程仓库:运行mvn install命令构建项目的时候,不用手动的去下载需要的jar文件,而项目却能够成功的构建,这是因为如果在本地仓库找不到响应的依赖,那么maven回去远程仓库查找。然后将远程仓库的依赖下载到本地仓库,maven本身自带了一个远程仓库,这个仓库是maven的中央仓库。
打开pom.xml,选择effective pom这个tab页,
  <repositories>
    <repository>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>central</id>
      <name>Central Repository</name>
      <url>http://repo.maven.apache.org/maven2</url>
    </repository>
  </repositories>
这就是中央仓库的配置,这就是从超级pom中继承而来的。

除了中央仓库,我们还可以在pom.xml中配置其他的远程仓库,例如开源仓库提供的远程仓库.在pom.xml文件中加入:
<repositories>
  <repository>
    <id>oschina</id>
    <name>oschina Repository</name>
    <url>http://maven.oschina.net/content/groups/public/</url>
  </repository>
</repositories>
这就成功的添加了一个远程仓库.

 

八、项目站点报告:
  Maven可以为项目生成一个静态站点,这个站点包含了项目的各种信息.同时他也可以生成项目的各种报告信息,只要你配置了需要的各种插件就可以。
比如可以配置checkSpell插件,checkSpell插件是一个用来检查java代码样式的工具,他可以帮助我们检查代码是否遵循了java规范,它特别适合小组开发时,代码样式规范的统一.通过配置checkSpell可以生成checkSpell报告.


  进入项目目录,进去shell,执行命令 mvn site,看到build success,然后去target目录可以看到生成了一个site目录,双击index.html可以查看当前项目的站点的样子,默认情况下,内容都是空的,修改pom.xml,添加一些内容,打开pom.xml,在project根标签内添加项:
  <name>项目的名字</name>
  <description>项目的描述信息</description>
  <url>http://www.xxx.com项目的URl</url>
  <organization>
  <name>项目的维护组织信息</name>
  <url>http://www.xxx.com</url>
  </organization>
  <developers>
    <developer>
      <id>study</id>
      <name>vbx</name>
      <email>aaa@ccc.com</email>
    </developer>
  </developers>

在pom文件的最后修改一下pom文件的配置,
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.plugins</groupId>
        <artifactId>maven-site-plugins</artifactId>
        <version>3.3</version>
        <configuration>
          <locales>zh_CN</locales>//修改站点的显示语言
        </configuration>
      </plugin>
    </plugins>
  </build>

执行mvn clean site清理站点
执行mvn site重新生成站点

posted @ 2015-07-25 18:02  不将就!  阅读(232)  评论(0编辑  收藏  举报