Maven 知识(一)

一. 简介

Maven 是 Apache 组织下的一个跨平台的项目管理工具,它主要用来帮助实现项目的构建、测试、打包和部署。Maven 提供了标准的软件生命周期模型和构建模型,通过配置就能对项目进行全面的管理。它的跨平台性保证了在不同的操作系统上可以使用相同的命令来完成相应的任务。Maven 将构建的过程抽象成一个个的生命周期过程,在不同的阶段使用不同的已实现插件来完成相应的实际工作,这种设计方法极大的避免了设计和脚本编码的重复,极大的实现了复用。

Maven 配置项目的核心是pom.xml 文件,POM 即 Project Object Module,项目对象模型,在 pom.xml 文件中定义了项目的基本信息、源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的 url、以及构建项目所用的插件,依赖继承关系。

二. 安装

下载安装步骤如下:

1)下载,在官网 http://maven.apache.org/download.cgi 下载即可

Maven 知识(一)_第1张图片
image.png

2)将压缩包解压到指定路径,比如我放到了 /opt 下

3)设置环境变量,命令如下

export M2_HOME=/yourPath/apache-maven-3.5.2
export PATH=M2_HOME/bin:  PATH

4)验证命令

mvn -v

三. Maven POM

刚才上面提到了maven 配置项目的核心就是pom.xml 文件,pom 文件的各节点分布大致如下



    
    4.0.0

    
    ...
    ...
    ...
    ...

    
    ...
    ...
    ...
    ...
    ...

    
    ...
    ...

    
    ...
    ...
    ...
    ...
    ...
    ...
    ...
    ...

    
    ...
    ...
    ...
    ...
    ...
    ...
    ...
    ...
    ...

基本配置

定义了该项目的坐标,

  • groupId:项目所在组的id,一般和公司相关
  • artifactId:项目在组内的id
  • version:项目版本号,如 1.0-SNAPSHOT,SNAPSHOT意为快照,说明项目在开发中,不是稳定版本
  • packaging:项目的打包方式,有以下值:pom, jar, maven-plugin, ejb, war, ear, rar, par
依赖配置

1)parent:如果项目是一个子项目,那么这个元素用来声明父项目的坐标


    com.whx
    project
    1.0.0-SNAPSHOT

2)modules:如果该项目包含子项目,这个元素用来指定包含的所有模块


    
    demo
    library

3)properties:属性,用来定义常量,Properties可以在整个POM中使用,格式是value,使用时用${name},遇到${name} 就替换为相应的值


    4.3.0.RELEASE
    src/main/resources/testngxml/frameworks.xml

4)dependencies:项目相关依赖配置,如果在父项目写的依赖,会被子项目引用,一般父项目会将子项目公用的依赖引入(将在之后详细讲解)。通过dependency 元素来精确声明依赖的坐标。


    
            junit
            junit
            4.12
            
            test
    

5)dependencyManagement:配置写法同dependencies


    
    .....
    

使用dependencyManagement 声明的依赖不会被子模块立即解析,只有子模块中只声明groupID和artifactID时,才使用此处的依赖信息。
关于配置依赖的更多内容请见后面的 “坐标与依赖”。

构建配置

1)build:用于配置项目构建相关信息

    
        
    
        
    
        
    
        
    
        
    
        
        
            
            
            
             ...    
             ...   
             ...  
            
        
        
        
        
        
            
            
                
            ... 
                
                
                
                
                
                
                
                
            
        
        
        
            
            
            ...    
            
        

        
        

        
        

        
      
         ... 
      

        
        
            
            
                
                
                
                 ...    
                 ...   
                 ...    
                    
                 false 
                    
                    
                        
                        
                            
                            
                            
                            
                            
                            
                            
                            
                            
                            
                        
                    
                    
                    
                        
                        
                        ......    
                        
                         
                    
                    
                    
                    
                
            
     

2)reporting:该元素描述使用报表插件产生报表的规范,当用户执行 “mvn site”,这些报表就会运行,在页面导航栏就能看到所有报表的链接。

    
        
        
        
        
        
        
            
            
                
                
                
                
                
                
                
                
                
                
                    
                    
                        
                        
                        
                        
                        
                        
                        
                        
                    
                
            
        

项目的描述信息
  • name:给用户提供更为友好的项目名
  • description:项目描述,maven文档中保存
  • url:主页的URL,maven文档中保存
  • inceptionYear:项目创建年份,4位数字。当产生版权信息时需要使用这个值
  • licenses:该元素描述了项目所有License列表。 应该只列出该项目的license列表,不要列出依赖项目的 license列表。如果列出多个license,用户可以选择它们中的一个而不是接受所有license。
    
        
    ...     
        
    ....
        
    repo     
        
    ....     

  • organization:1.name 组织名 2.url 组织主页url
  • developers:项目开发人员列表(如下)
  • contributors:项目其他贡献者列表,同developers
  
    
      
        
        ....  
        
        ...  
        
        ...  
        
        ...
        
          
            Java Dev  
            Web UI  
         
         
        sun  
        
        ...  
        
        
            
         
         
        +8  
      

环境设置

1)issueManagement:目的问题管理系统(Bugzilla, Jira, Scarab)的名称和URL


    Bugzilla
    http://127.0.0.1/bugzilla/

2)ciManagement:持续集成系统信息


    
    continuum
    http://127.0.0.1:8080/continuum

    
    
        
            
            mail
            
            true
            
            true
            
            false
            
            false
            
            
[email protected]

3)mailLists:项目相关邮件列表信息


    
        User List
        [email protected]
        [email protected]
        [email protected]
        http://127.0.0.1/user/
        
            http://base.google.com/base/1/127.0.0.1
        
    
    .....

  • subscribe, unsubscribe: 订阅邮件(取消订阅)的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建
  • archive:浏览邮件信息的URL
  • post:接收邮件的地址

4)scm:允许你配置你的代码库,供Maven web站点和其它插件使用


    scm:svn:http://127.0.0.1/svn/my-project
    scm:svn:https://127.0.0.1/svn/my-project
    HEAD
    http://127.0.0.1/websvn/my-project

  • connection, developerConnection:这两个表示我们如何连接到maven的版本库。connection只提供读,developerConnection将提供写的请求

写法如:scm:[provider]:[provider_specific]
如果连接到CVS仓库,可以配置如下:scm:cvs:pserver:127.0.0.1:/cvs/root:my-project
tag:项目标签,默认HEAD
url:共有仓库路径

5)prerequisite:项目构建的前提


    2.0.6

6)repositories、pluginRepositories:依赖和扩展的远程仓库列表


    
        
            false
            always
            warn
        
        
            true
            never
            fail
        
        codehausSnapshots
        Codehaus Snapshots
        http://snapshots.maven.codehaus.org/maven2
        default
    


    ...

  • releases, snapshots: 这是各种构件的策略,release或者snapshot。这两个集合,POM就可以根据独立仓库任意类型的依赖改变策略。如:一个人可能只激活下载snapshot用来开发。

  • enable:true或者false,决定仓库是否对于各自的类型激活(release 或者 snapshot)。

  • updatePolicy: 这个元素决定更新频率。maven将比较本地pom的时间戳(存储在仓库的maven数据文件中)和远程的. 有以下选择: always, daily (默认), interval:X (x是代表分钟的整型) , never。

  • checksumPolicy:当Maven向仓库部署文件的时候,它也部署了相应的校验和文件。可选的为:ignore,fail,warn,或者不正确的校验和。

  • layout:在上面描述仓库的时候,提到他们有统一的布局。Maven 2 & 3 的仓库布局是default。然而,Maven 1.x有不同布局。使用这个元素来表明它是default还是legacy。

7)distributionManagement:管理发布时的相关信息,


    ...
    http://mojo.codehaus.org/my-project
    deployed

    
        false
        corp1
        Corporate Repository
        scp://repo/maven2
        default
    

    
      ...
    

    
        mojo.website
        Mojo Website
        scp://beaver.codehaus.org/home/projects/mojo/public_html/
    

    
        org.apache
        my-project
        1.0
        We have moved the Project under Apache
    


  • downloadUrl: 其他pom可以通过此url的仓库抓取组件

  • status:给出该构件在远程仓库的状态,有以下几种
    none: 默认,没有特殊状态
    converted: 将被早期Maven 2 POM转换过来
    partner: 这个项目会从合作者仓库同步过来
    deployed: 最常见的状态,从Maven 2或3实例部署,这也是我们使用deploy 命令手动部署时的状态
    verified: 已经被验证并且是最终的版本

  • repository:指定Maven pom从远程下载控件到当前项目的位置和方式,当snapshot 模式发布时,如果snapshotRepository没有被定义则使用repository相关的配置
    id, name:仓库的唯一标识
    uniqueVersion:true或false,指明控件部署的时候是否获取独立的版本号。
    url:repository元素的核心。指定位置和部署协议发布控件到仓库。
    layout:布局,default或legacy

  • site:多分布存储库,定义如何部署项目的网站和文档,包含的元素和repository 中相同。

  • relocation:重新部署-项目不是静态的,是活的,随着项目的增长,有时需要将它转移到更合适的地方。如:当你的下个成功的开源项目移到Apache下,重命名为org.apache:my-project:1.0 对你项目更有好处。

8)profiles:profile 是POM 4.0 新增的功能,可以让我们定义一系列的配置信息,然后指定其激活条件。 根据每个profile对应不同的激活条件和配置信息,从而达到不同环境使用不同配置。


    
        test
        
        ...

        
        ...
        ...
        ...
        ...
        ...
        ...
        ...
        ...
        ...
    

  • activation:激活条件,当有一个或更多条件满足时就会触发激活,当遇到第一个激活条件时,匹配过程会停止并把该profile 标记为活动状态

    false
    1.5
    
        Windows XP
        Windows
        x86
        5.1.2600
    
    
        sparrow-type
        African
    
    
        ${basedir}/file2.properties
        ${basedir}/file1.properties
    

 jdk:检测到对应jdk版本就激活
 os:针对不同操作系统
 property:当maven检测到property(pom中如${name} 这样的)profile将被激活
 file:如果存在该文件则激活,如果不存在该文件则激活

关于pom 文件的介绍就暂时这么多。下面介绍一下maven 的其他知识

四. 坐标与依赖

坐标

maven 使用坐标来唯一标识一个构件,构件可以理解为jar/war 包。maven根据坐标,去中央仓库http://repo1.maven.org/maven2下载构件,该中央仓库包含了世界上大部分流行的开源项目构件。

坐标构成:groupId, artifactId, version, packing, classifier 。

  • groupId: 定义当前Maven项实际隶属的项目。之前说对应公司或者组织,而实际上会更加具体
  • artifactId: 定义实际项目中的一个Maven项目(模块)
  • version: 版本
  • packing(非必须声明): 打包方式,打包方式有jar和war,默认方式为jar,两者会使用不同的命令。并非一定与构件扩展名对应,比如packaging为maven-plugin的扩展名为jar
  • classifier(不能直接定义): 是项目的附属构件,不是由项目直接生成的,而是由附加的插件帮助生成
依赖

maven 中使用dependency 元素定义依赖,定义一个依赖需要包含坐标信息,除此之外还可以包含以下元素:

  • type:依赖的类型,默认是jar
  • scope:依赖的范围,有compile,test,provided,runtime,system 等,默认compile。
    compile 范围的 Maven 依赖, 对于编译、测试、运行都有效,如spring-core;

    test 范围的 Maven 依赖, 只对于测试有效,在 编译主代码或者运行项目的使用时将无法使用此类依赖,比如JUnit;

    provided 范围的 Maven 依赖,对于编译和测试有效,但在运行时无效,比如 servlet-api, 编译和测试项目的时候 需要该依赖,但在运行项目的时候,由于容器已经提供, 就不需要 Maven 重复的引入一遍;

    runtime 范围的 Maven 依赖, 对于测试和运行有效, 但在编译主代码时无效,典型的例子是 JDBC 驱动实现,项目主代码的编译只需要 JDK 提供的 JDBC 接口, 只有在执行测试或者运行项目的时候才需要实 现上述接口的具体 JDBC 驱动;

    system 依赖与provided 依赖范围完全一 致,但是, 使用 System 范围的依赖时必须通过 systemPath 元素显式地指定依赖文件的路径,由于此类依赖不是通过 Maven 仓库解析的,而且往往与本机系统绑定, 可能造成构建的不可移植, 因此应该谨慎使用。

    import (仅可在maven 2.0.9 及以后使用)这个范围只能使用在type 为pom 的dependencyManagement 元素中,意为从其他pom 导入dependency 配置。不参与依赖的传递。举个栗子

    ...
    pom
    B
    
        
            
                com.whx
                A
                1.0
                pom
                import
            
        
    



                    

你可能感兴趣的:(Maven 知识(一))