zoukankan      html  css  js  c++  java
  • Maven入门

    简介

      Maven主要服务于基于java平台的项目构建,依赖管理和项目信息管理。无论是小型的开源类库项目,还是大型的企业级应用;无论是传统的瀑布式开发,还是流行的敏捷开发模式,maven都能大显身手。

    构建流程

    maven约定

    src/main/java: 存放项目的java文件。

    src/main/resources: 存放项目的资源文件,如spring,hibernate的配置文件。

    src/test/java: 存放所有的测试的java文件。

    src/test/resources: 存放测试用的资源文件。

    target: 项目输出位置。

    pom.xml 文件

    maven安装及使用

    1下载并配置环境变量

    (1)在path路径添加Maven的bin目录路径

        D:maven-3.3.9in

    (2)添加环境变量 M2_HOME

         M2_HOME = D:maven-3.3.9

    2 eclipse集成maven插件并创建一个maven项目

        参考:http://www.cnblogs.com/yangang2013/p/5651906.html

    pom.xml

      pom作为项目对象模型。通过xml表示maven项目,使用pom.xml来实现。主要描述了项目:包括配置文件;开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,以及其他所有的项目相关因素。更多内容参考:

    http://blog.csdn.net/zhuxinhua/article/details/5788546

    1坐标和依赖

      <groupId>...</groupId>
      <artifactId>...</artifactId>
      <version>...</version>
      <packaging>...</packaging>

      <name>...</name>

    groupId:项目或者组织的唯一标志,并且配置时生成路径也是由此生成,如org.myproject.mojo生成的相对路径为:/org/myproject/mojo

    artifactId:项目的通用名称

    version:项目的版本

    packaging:打包机制,如pom,jar,maven-plugin,ejb,war,ear,rar,par

    name:用户描述项目的名称,无关紧要的东西,可选

    url:应该是只是写明开发团队的网站,无关紧要,可选

    classifer:分类

    其中groupId,artifactId,version,packaging这四项组成了项目的唯一坐标。一般情况下,前面三项就可以组成项目的唯一坐标了。

    依赖

    依赖关系:

    <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.0</version>
          <type>jar</type>
          <scope>test</scope>
          <optional>true</optional>
        </dependency>
    
        <dependency>
    
            <groupId>com.alibaba.china.shared</groupId>
    
            <artifactId>alibaba.apollo.webx</artifactId>
    
            <version>2.5.0</version>
    
            <exclusions>
    
              <exclusion>
    
                <artifactId>org.slf4j.slf4j-api</artifactId>
    
                <groupId>com.alibaba.external</groupId>
    
              </exclusion>
    
              ....
    
            </exclusions>
    
    ......
    
    </dependencies>
    View Code

    dependency里属性介绍:

    type:默认为jar类型,常用的类型有:jar,ejb-client,test-jar...,可设置plugins中的extensions值为true后在增加 新的类型,

    scope:是用来指定当前包的依赖范围,maven的依赖范围

    optional:设置指依赖是否可选,默认为false,即子项目默认都继承,为true,则子项目必需显示的引入,与dependencyManagement里定义的依赖类似 。

    exclusions:如果X需要A,A包含B依赖,那么X可以声明不要B依赖,只要在exclusions中声明exclusion.

    exclusion:是将B从依赖树中删除,如上配置,alibaba.apollo.webx不想使用com.alibaba.external  ,但是alibaba.apollo.webx是集成了com.alibaba.external,r所以就需要排除掉.

    依赖范围

    非开源包,maven支持不了这个包,那么则有有三种 方法处理:

    1.本地安装这个插件install plugin

    例如:mvn install:intall-file -Dfile=non-maven-proj.jar -DgroupId=som.group -DartifactId=non-maven-proj -Dversion=1

    2.创建自己的repositories并且部署这个包,使用类似上面的deploy:deploy-file命令,

    3.设置scope为system,并且指定系统路径。

    传递性依赖

      compile test provided runtime
    compile compile _ _ runtime
    test test _ _ test
    provided provided _ provided provided
    runtime runtime _ _ runtime

     

     

     

     

    例如,项目A有一个compile范围的B依赖,B有一个compile范围的C依赖,那么C就会成为A的compile范围的依赖。

    依赖调解

    传递路径长度取最短原则,传递路径长度相等时,采取最先申明原则。

    可选依赖

    尽量少用,可选依赖不会被传递,需要显式申明。

    排除依赖

    排除一些传递性的依赖,如果需要依赖,则显式配置。

    <dependency>  
        <groupId>javax.mail</groupId>  
        <artifactId>mail</artifactId>  
        <version>1.4.1</version>  
        <exclusions>  
            <exclusion>  
                <groupId>javax.activation</groupId>  
                <artifactId>activation</artifactId>  
            </exclusion>  
        </exclusions>  
    </dependency>  
    <dependency>  
        <groupId>javax.activation</groupId>  
        <artifactId>activation</artifactId>  
        <version>1.1</version>  
    </dependency> 

    归类依赖

    当同一个模块,所依赖的几个模块版本都相同时,可以使用maven里的属性做分类依赖,依赖版本升级时改一处即可。

     1 <properties>  
     2     <springframework.version>2.5.6</springframework.version>  
     3 </properties>  
     4 <dependencies>  
     5     <dependency>  
     6         <groupId>org.springframework</groupId>  
     7         <artifactId>spring-core</artifactId>  
     8         <version>${springframework.version}</version>  
     9         <type>jar</type>  
    10         <scope>compile</scope>  
    11     </dependency>  
    12     <dependency>  
    13         <groupId>org.springframework</groupId>  
    14         <artifactId>spring-beans</artifactId>  
    15         <version>${springframework.version}</version>  
    16         <type>pom</type>  
    17         <scope>compile</scope>  
    18     </dependency>  
    19     <dependency>  
    20         <groupId>org.springframework</groupId>  
    21         <artifactId>spring-context</artifactId>  
    22         <version>${springframework.version}</version>  
    23         <type>jar</type>  
    24         <scope>compile</scope>  
    25     </dependency>  
    26     <dependency>  
    27         <groupId>org.springframework</groupId>  
    28         <artifactId>spring-context-support</artifactId>  
    29         <version>${springframework.version}</version>  
    30         <type>jar</type>  
    31         <scope>compile</scope>  
    32     </dependency>  
    33 </dependencies>  
    View Code

    优化依赖

    可概括为三个命令

    mvn dependency:list

    表示依赖列表,maven eclipse插件已经实现,有图形化显示,在pom.xml的dependencies页

    mvn dependency:tree

    表示依赖列表,maven eclipse插件已经实现,有图形化显示,在pom.xml的dependency hierarchy页

    mvn dependency:analyze

    查找出在编译和测试中未使用但显示声明的依赖

     

    maven仓库

    maven生命周期

    Maven有三套相互独立的生命周期,分别是clean、default和site。每个生命周期包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段。

    1、clean生命周期:清理项目,包含三个phase。

    1)pre-clean:执行清理前需要完成的工作

    2)clean:清理上一次构建生成的文件

    3)post-clean:执行清理后需要完成的工作

    2、default生命周期:构建项目,重要的phase如下。

    1)validate:验证工程是否正确,所有需要的资源是否可用。
    2)compile:编译项目的源代码。  
    3)test:使用合适的单元测试框架来测试已编译的源代码。这些测试不需要已打包和布署。
    4)Package:把已编译的代码打包成可发布的格式,比如jar。
    5)integration-test:如有需要,将包处理和发布到一个能够进行集成测试的环境。
    6)verify:运行所有检查,验证包是否有效且达到质量标准。
    7)install:把包安装到maven本地仓库,可以被其他工程作为依赖来使用。
    8)Deploy:在集成或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。

    3、site生命周期:建立和发布项目站点,phase如下

    1)pre-site:生成项目站点之前需要完成的工作

    2)site:生成项目站点文档

    3)post-site:生成项目站点之后需要完成的工作

    4)site-deploy:将项目站点发布到服务器

     命令行和生命周期

    各个生命周期相互独立,一个生命周期的阶段前后依赖。

    举例如下:

    1、mvn clean

    调用clean生命周期的clean阶段,实际执行pre-clean和clean阶段

    2、mvn test

    调用default生命周期的test阶段,实际执行test以及之前所有阶段

    3、mvn clean install

    调用clean生命周期的clean阶段和default的install阶段,实际执行pre-clean和clean,install以及之前所有阶段

    自定义mvn命令

    单击 上图中的maven Build...,自定义命令 mvn clean install:

    定义完成后,点击maven Build,可以看到定义好的命令:

    生命周期与插件关系

    maven 常用插件POM配置

    聚合与继承

    eclipse中搭建maven聚合工程

    聚合就是把多个模块或项目聚合到一起,我们可以建立一个专门负责聚合工作的Maven project ---  aggregator。

    建立该project的时候,我们要注意以下几点:

    1.该aggregator本身也做为一个Maven项目,它必须有自己的POM

    2.它的打包方式必须为: pom

    3.引入了新的元素:modules---module

    4.版本:聚合模块的版本和被聚合模块版本一致

    5.relative path:每个module的值都是一个当前POM的相对目录

    6.目录名称:为了方便的快速定位内容,模块所处的目录应当与其artifactId一致(Maven约定而不是硬性要求),总之,模块所处的目录必须和<module>模块所处的目录</module>相一致。

    7.习惯约定:为了方便构建,通常将聚合模块放在项目目录层的最顶层,其它聚合模块作为子目录存在。这样当我们打开项目的时候,第一个看到的就是聚合模块的POM

    8.聚合模块减少的内容:聚合模块的内容仅仅是一个pom.xml文件,它不包含src/main/Java、src/test/java等目录,因为它只是用来帮助其它模块构建的工具,本身并没有实质的内容。

    9.聚合模块和子模块的目录:他们可以是父子类,也可以是平行结构,当然如果使用平行结构,那么聚合模块的POM也需要做出相应的更改。

    可创建平行模块:

    继承

     继承就是避免重复,maven的继承也是这样,它还有一个好处就是让项目更加安全。

    如何配置继承:

    1.说到继承肯定是一个父子结构,那么我们在aggregator中来创建一个parent project

    2.<packaging>: 作为父模块的POM,其打包类型也必须为POM

    3.结构:父模块只是为了帮助我们消除重复,所以它也不需要src/main/java、src/test/java等目录

    4.新的元素:<parent> , 它是被用在子模块中的

    5.<parent>元素的属性:<relativePath>: 表示父模块POM的相对路径,在构建的时候,Maven会先根据relativePath检查父POM,如果找不到,再从本地仓库查找

    6.relativePath的默认值: ../pom.xml

    7.子模块省略groupId和version: 使用了继承的子模块中可以不声明groupId和version, 子模块将隐式的继承父模块的这两个元素。

    maven依赖管理

    dependencyManagement的特性:在dependencyManagement中配置的元素既不会给parent引入依赖,也不会给它的子模块引入依赖,仅仅是它的配置是可继承的。

    <span style="white-space:pre">    </span><properties>  
            <target.version>2.5.6</target.version>  
        </properties>  
      
        <dependencyManagement>  
            <dependencies>  
                <dependency>  
                    <groupId>your groupId</groupId>  
                    <artifactId>your artifactId</artifactId>  
                    <version>${target.version}</version>  
                </dependency>  
            </dependencies>  
        </dependencyManagement>  
    View Code

    子模块的POM继承这些配置:子模块继承这些配置的时候,仍然要声明groupId和artifactId,表示当前配置是继承于父POM的,从而直接使用父POM的版本对应的资源。

    <span style="white-space:pre">        </span><dependencies>  
                <dependency>  
                    <groupId>your groupId</groupId>  
                    <artifactId>your artifactId</artifactId>  
                </dependency>  
            </dependencies>  
    View Code

    使用nexus创建私服

    使用maven构建web应用

    参考:maven实战

  • 相关阅读:
    [one day one question] safari缓存太厉害
    对工厂方法模式的一些思考(2)
    对工厂方法模式的一些思考(java语法表示)
    [选译]MySQL5.7以上Zip版官方安装文档
    clojure 使用阿里云仓库
    对jbox2d引擎的一些回顾与思考(swing实现demo)
    定位
    空白空间及溢出的处理
    BFC
    高度自适应
  • 原文地址:https://www.cnblogs.com/gaojy/p/6675642.html
Copyright © 2011-2022 走看看