软件项目管理工具Maven

一、Maven简介及环境搭建

1、Maven简介

  Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的搭建、报告和文档的软件项目管理工具。
  POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示,名称叫做pom.xml。在Maven中,当谈到Project的时候,不仅仅是一堆包含代码的文件。一个Project往往包含一个配置文件,包括了与开发者有关的、缺陷跟踪系统、组织与许可、项目的URL、项目依赖、以及其他。它包含了所有与这个项目相关的东西。事实上,在Maven世界中,project可以什么都没有,甚至没有代码,但是必须包含pom.xml文件。

2、Maven下载及环境配置

1)、Maven的官网:http://maven.apache.org/。

软件项目管理工具Maven_第1张图片

  将Maven的压缩包解压之后的目录如下:
软件项目管理工具Maven_第2张图片

  bin目录包含mvn的运行脚本,m2.conf:配置文件;
  boot目录包含一个类加载器的框架,Maven使用它来加载自己的类库;
  conf目录是一些配置文件;
  lib目录下包含一些类库,自己运行的包括第三方的一些类库。

2)、Maven环境变量的配置:
  M2_HOME变量:

软件项目管理工具Maven_第3张图片

  PATH变量:
软件项目管理工具Maven_第4张图片


3)、验证环境变量是否配置成功:
  命令提示符下输入:mvn -v

软件项目管理工具Maven_第5张图片


二、Maven的Hello world程序

1、Maven项目的目录结构

src
    -main
        -java
            -package
    -test
        -java
            -package
    resources


2、创建项目

软件项目管理工具Maven_第6张图片

  main和test目录下都含有java目录。
  在main的java目录下,新建类包的目录结构,并编写HelloWorld.java。

package com.zxt.model;

public class HelloWorld {

    public static String sayHello() {
        return "Hello World!!";
    }
}

  在test的java目录下,新建类包的目录结构,并编写测试类HelloWorldTest.java。

package com.zxt.model;

import org.junit.*;
import org.junit.Assert.*;

public class HelloWorldTest {

    @Test
    public void testSayHello() {
        Assert.assertEquals("Hello World!!", HelloWorld.sayHello());
    }
}


3、pom.xml
  创建pom.xml文件管理项目(位于项目的根目录下),pom文件的格式可以从其他项目中拷贝过来,例如spring,struts等。
   groupId的值就是项目的包名
   artifactId是模块的名
  版本

  
  
    
      junit
       junit
      4.12
    

  





    
    4.0.0

    
    com.zxt.model
    maven01-model
    0.0.1-SNAPSHOT

    
    
        
            junit
            junit
            4.12
        
    



4、编译运行
  在命令提示符中切换到项目目录,并使用mvn compile命令编译项目:

软件项目管理工具Maven_第7张图片
软件项目管理工具Maven_第8张图片

  编译成功后,运行mvn test执行测试用例:
软件项目管理工具Maven_第9张图片

  对项目进行打包,mvn package。
软件项目管理工具Maven_第10张图片


三、Maven常用的构建命令

mvn –v 查看maven版本;
  compile 编译maven项目;
  test 运行测试;
  package 打包,maven项目;
  clean 删除target文件(java源代码编译生成的二进制字节码,项目说明文档等);
  install 安装jar包到本地仓库中。

1、install命令的使用实例

1)、创建类似于maven01的项目maven02。其源代码及测试代码如下:
Speak.java

package com.zxt.model02;

import com.zxt.model.HelloWorld;

public class Speak {
    
    public static String sayHi() {
        return "Hello World!!";
    }
}

SpeakTest.java

package com.zxt.model;

import org.junit.*;
import org.junit.Assert.*;

public class SpeakTest {

    @Test
    public void testSayHi() {
        Assert.assertEquals("Hello World!!", Speak.sayHello());
    }
}

可以看出在Speak.java中引用了maven01项目中的HelloWorld类。这时候直接编译maven02项目,会出错:

软件项目管理工具Maven_第11张图片

  2)、切换到maven01项目的目录下,使用mvn install命令,将maven01的jar包安装到本地仓库中,并在maven02的pom.xml文件中添加maven01的jar包依赖,再来编译maven02,则可以成功。
  
    com.zxt.model
    maven01-model
    0.0.1-SNAPSHOT
  

  3)、Maven项目的jar包依赖通过标签来管理,当程序中引用某个jar包中的类,则首先会在pom.xml文件的依赖中查找,如果在pom.xml文件中有相应的,则会在本地仓库中查找相关的jar文件,如果本地仓库中没有,则会联网向Maven的中央仓库中查找,并将相关文件下载到本地仓库中。

2、创建项目的两种方式

  可以使用命令直接生成项目的目录结构:
  1)mvn archetype:generate 按照提示进行选择,设置。
  2)mvn archetype:generate –DgroupId=组织名(公司网址反写+项目名)
              -DartifactId=项目名-模块名
              -Dversion=版本号
              -Dpackage=代码所在包名

软件项目管理工具Maven_第12张图片


四、Maven仓库中的坐标

  1、Maven项目中的依赖一般称为构件,它用Maven坐标来表示:


    4.0.0
    org.codehaus.mojo
    my-project
    1.0

  上面的POM定义的是Maven2&3都承认的最小部分。groupId:artifactId:version是必须的字段(尽管在继承中groupId和version不需要明确指出)。这三个字段就像地址和邮戳,它标记了构件在仓库中的特定位置,就像Maven projects的坐标系统一样。

  2、Maven的仓库分为本地仓库和中央仓库。
  本地仓库默认保存在系统的用户目录的.m2目录中:C:\Users\Administrator.m2\repository。
  一般情况下,我们不希望数据保存在C盘,因此可以进行本地仓库位置的修改,在Maven的conf目录下,打开settings.xml文件,找到:
  /path/to/local/repo
  取消注释,配置自己的仓库位置:
  E:/Maven/repo

  3、镜像仓库
  因为Maven的中央仓库在国外,因此有可能会使用到镜像仓库,同样在settings.xml文件中进行配置:


    
        maven.net.cn
        
        central
        central mirror in china
        
        http://maven.net.cn/content/groups/public
    


  4、settings.xml
  此外由于settings.xml中有较多的用户设置,因此可以将它单独拿出,放到用户自己的路径中,防止Maven更新时被覆盖。

  5、Maven在eclipse中的使用。
  在高版本的eclipse中,默认已经有Maven的插件,不需要自己安装。因此配置好自己的Maven目录以及自定义的设置文件即可。可以在设置文件settings.xml中设置Maven使用的JDK的版本:


    jdk-1.8
    
        true
        1.8
    
    
        1.8
        1.8
        1.8
    


五、Maven生命周期

clean  清理项目
  pre-clean执行清理前的工作
  clean清理上一次构建生成的所有文件
  post-clean执行清理后的文件
default  构建项目(最核心)
  compile、test、package、install等.
site  生成项目站点
  pre-site在生成项目站点前要完成的工作
  site生成项目的站点文档
  post-site在生成项目站点后要完成的工作
  site-deploy发布生成的站点到服务器上

六、pom.xml文件详解

1、概览

  下面是一个POM项目中的pom.xml文件中包含的元素。注意,其中的modelVersion是4.0.0,这是当前仅有的可以被Maven2&3同时支持的POM版本,它是必须的。




            
    4.0.0
    
    
    ...
    ...
    ...
    ...
    ...
    ...
    ...
    ...
    ...
    
    
    ...
    ...
    
    
    ...
    ...
    ...
    ...
    ...
    ...
    ...
    ...
    
    
    ...
    ...
    ...
    ...
    ...
    ...
    ...
    ...
    ...
    

  POM包含了一个project所需要的所有信息,当然也就包含了构建过程中所需要的插件的配置信息,事实上,这里申明了"who", "what",和"where",然而构建生命周期(build lifecycles)中说的是"when"和"how"。这并不是说POM不能影响生命周期的过程--事实上它可以。例如,配置一个可以嵌入ant任务到POM的mavem-antrun-plugin,它基本上就是一个声明,就像build.xml告诉ant当运行时它该做什么一样。一个POM声明了它自己的配置,如果外力迫使生命周期跳过了ant插件的执行,这并不影响那些已经执行过的插件产生的效果。这一点和build.xml不一样。

2、基础设置





    
    4.0.0

    
    com.winner.trade
    
    trade-core
    
    
    1.0.0-SNAPSHOT


    
    jar
    
    
    
    
    
    
    
    
    

    
    ...


    
    

        
        
            
            
            com.winner.trade
            trade-test
            1.0.0-SNAPSHOT

            
            
            test

            
            false

            
            
                
                    org.slf4j
                    slf4j-api
                
            
        
        
        ...
        
    
    
    
    
    
        
            
        
    


    
    
        UTF-8
        1.5
        1.5
    
    

  一般来说,上面的几个配置项对任何项目都是必不可少的,定义了项目的基本属性。
  这里有必要对一个不太常用的属性classifier做一下解释,因为有时候引用某个jar包,classifier不写的话会报错。
  classifier元素用来帮助定义构件输出的一些附属构件。附属构件与主构件对应,比如主构件是 kimi-app-2.0.0.jar,该项目可能还会通过使用一些插件生成,如kimi-app-2.0.0-javadoc.jar (Java文档)、 kimi-app-2.0.0-sources.jar(Java源代码)这样两个附属构件。这时候,javadoc、sources就是这两个附属构件的classifier,这样附属构件也就拥有了自己唯一的坐标。
  classifier的用途在于:
  1、maven download javadoc / sources jar包的时候,需要借助classifier指明要下载那个附属构件。
  2、引入依赖的时候,有时候仅凭groupId、artifactId、version无法唯一的确定某个构件,需要借助classifier来进一步明确目标。比如JSON-lib,有时候会同一个版本会提供多个jar包,在JDK1.5环境下是一套,在JDK1.3环境下是一套:引用它的时候就要注明JDK版本,否则maven不知道你到底需要哪一套jar包:jdk15

3、构建过程设置



    
    myPorjectName

    
    ${basedir}/target  

    
    
    install

    
    
    
        ../filter.properties
    

    
    
        
            
            
            
            resources

            
            true

            
            src/main/resources

            
            
                **/*.properties
                **/*.xml
            

            
            
                jdbc.properties
            
        
    


    
    
        
            
            maven-assembly-plugin
            2.5.5

              
            
                
                    
                    assembly

                    
                    package

                    
                    
                        single
                    

                    
                    false
                
            

            
            
                ${finalName}
                false
                assembly.xml
            

            
            
            false

            
            
                ...
            

            
            true
        
    


    
    
        
            
            
            
            
            
        
    

      
    ${basedir}\src\main\java  

    
    ${basedir}\src\main\scripts

    
    ${basedir}\src\test\java

    
    ${basedir}\target\classes

    
    ${basedir}\target\test-classes

    
    
    
    
        
        
        
          
        
        
            org.apache.maven.wagon
            wagon-ssh
            2.8
        

    

    
    
    
    
        ...
    


你可能感兴趣的:(软件项目管理工具Maven)