为什么我要对后生说你要懂Maven呢

序言

  据说半夜喝咖啡敲出来的代码,有一种淡淡的咖啡味道;那半夜写出来的总结,是不是也会有一种夜晚的宁静呢!今晚夜深人静,就给后生们总结总结Maven吧!毕竟,今天搞J2E的工程师如果不会或不知道Maven,那就在圈子里尴尬了。Maven是一个采用纯Java编写的开源项目管理工具。Maven采用了一种被称之为project object model (POM)概念来管理项目,所有的项目配置信息都被定义在一个叫做POM.xml的文件中,通过该文件,Maven可以管理项目的整个声明周期,包括编译,构建,测试,发布,报告等等。目前Apache下绝大多数项目都已经采用Maven进行管理。而Maven本身还支持多种插件,可以方便更灵活的控制项目。

一句话:Maven是一个项目管理和构建工具,主要做编译、测试、报告、打包、部署等操作完成项目的构建。

基础概述

  Maven能干嘛呢?

  1.项目自动化编译部署:

  2.项目jar包的依赖管理:

  3.企业开发分包分模块部署:

 

 

怎样下载、安装、配置

  首先,肯定是官网看看(https://maven.apache.org)喽!

  2. 将下载好的maven(压缩版的)进行解压/并拷贝自己的开发目录

   3. 设置系统环境变量
      设置Maven_HOME(例如:D:\dev\maven3.3.9)
      设置PATH(例如:%MAVEN_HOME%\bin)

  4. mvn -v 检查是否安装成功

  5. maven仓库的定位

    1. 配置用户范围的settings.xml(MAVEN_HOME/conf/settings.xml拷贝至C:\Users\admin.m2目录下)

    2. 打开settings.xml文件将仓库路径修改(打开复制好的文件并修改里面的节点内容,指定自己的本地库。见下图:)

 

  6. Maven遵循约定优于配置的原则(有约定好的默认值和目录机构、框架基础)

项目输出位置

 

   首次运行mvn compile会看到奇怪的下载内容。。。。。。???

 

  为了保证Maven顺利运行,会从远程仓库下载部分jar包到本地库, 本地库地址就是你自己配置的MAVEN_HOME/conf/settings.xml文件里面的内容

    

  当你第一次运行 maven 的时候,它会从网上的 maven 库 (repository) 下载需要的程序, 存放在你电脑的本地库 (local repository) 中,所以这个时候你需要有 Internet 连接。

    Maven 默认的本地库是 ~/.m2/repository/ ,

    在 Windows 下是 %USER_HOME%.m2\repository\

  9. 项目单元测试的编译:mvn test

  10. 打包(生成target目录,编译、测试代码,生成测试报告,生成jar/war文件):mvn package 

  11. 发布项目提交到本地仓库:mvn install

  12. Maven的生命周期

  完整的项目构建过程通常包括清理、编译、测试、打包、集成测试、验证、部署等步骤,Maven从中抽取了一套完善的、易扩展的生命周期。Maven的生命周期是抽象的,其中的具体任务都交由插件来完成。

Maven的生命周期和插件

  1. 什么是插件

  定位:C:\Users\~.m2\repository\org\apache\maven\plugins

  

 

  2. 生命周期阶段与插件关系

    Maven 的生命周期是抽象的,实际需要插件来完成任务。 这一过程是通过将插件的目标(goal)绑定到生命周期的具体阶段(phase)来完成的。 如:将 maven-compiler-plugin插件的compile目标绑定到default生命周期的compile阶段,完成项目的源代码编译

 

  3. maven的内置插件

    我们在执行maven命令的时候 mvn clean compile package等, maven会通过自己内置插件帮我们执行项目的清理/编译/打包工作, 这些也是通过maven的内置插件实现的

核心概念

坐标

 

packageing:定义打包方式,默认jar包,如果是web项目是war包

 

仓库

   本地库

    1. ~/.m2/settings.xml/该文件里面的配置

    2. 每个用户只有一个本地仓库

   远程库

    1. 中央库:Maven默认的远程仓库,http://search.maven.org/

    2. 私服库:是一种特殊的远程仓库,它是架设在局域网内的仓库(例如使用Sonatype Nexus搭建Maven私服 )

  镜像库

    1. 用来替代中央仓库,速度一般比中央仓库快

依赖

 

  基本概念:
    依赖关系列表(dependency list)是POM的重要部分,也就是我们项目对jar包的管理
  jar包去哪找?
    http://mvnrepository.org/
    http://search.maven.org/
    http://maven.outofmemory.cn/
  jar如何添?
    示例如下:

    <dependencies>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>4.2.5.RELEASE</version>
      </dependency>
    </dependencies>

 依赖传递
    最短路径:路径最近者优先(只会选择路径最短的一个,不会两个都下载,不然就是jar包冲突,
实际开发中,maven自己搞定,我们只需要了解

    最先申明:路径相同者POM文件里面的,第一声明者优先
依赖引用
    说白了,就是需要maven2工程里面可以引入maven1工程,
 1) maven1可以作为jar包发布到本地库
   针对maven1的pom.xml运行 mvn install

 2) 让maven2的pom.xml里面引用maven1,作为jar包填入。
     引用maven1的jar包
    <dependency>
      <groupId>com.****.p2p</groupId>
      <artifactId>maven1</artifactId>
      <version>0.0.1-SNAPSHOT</version>
   </dependency>

 依赖排除
    引用工程之间有同样功能的jar包,也即jar包重复,如何破?
    新建新工程maven2:
        1. 依赖排除,去重复

               <dependency>
          <groupId>com.atguigu.crm</groupId>
          <artifactId>maven1</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <exclusions><!-- 依赖排除 -->
              <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>       
               </exclusion>
          </exclusions>
       </dependency>
       <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.2</version>  
       </dependency>

        2. jar包重复情况
        

1 比如Maven02自引用了
     <dependency>
     <groupId>commons-logging</groupId>
     <artifactId>commons-logging</artifactId>
     <version>1.1.2</version>     
   </dependency>


2 Maven03又引用了Maven02+commons-logging-1.1.1.jar


3 问题:commons-logging1.1.2和commons-logging1.1.1会冲突

  
  

 


4 用到了那个?mavne03如何做出选择?我们如何手工排除? 4.1 用到了1.1.1 4.2 依据是最短路径 4.3 假如不想用maven02工程的1.1.2,需要在引用包里面添加

 

 

 

依赖范围
  maven在构建过程有3套classpath,我们会根据配置依赖的范围依赖不同的classpath:

  

    compile:默认是compile,对 编译+测试+运行 都有效
    provided:对编译和测试,运行的时候不需要加入(例如 jsp 依赖 searvlet api ,比如我们在编译和测试的时候有效但是在运行的时候容器已经提供servletapi,如果加入会造成冲突)
    runtime:只在测试和运行时 有效,比较典型的例子 jdbc api,只有在启动代码测试或者运行的时候才会启用

聚合

  聚合模块为项目目录的最顶层,其他模块作为聚合模块子目录而存在。目的是为一次性批处理各个模块构建多个项目模块。

      aggregation聚合,Modules快速构建
        建立总体的聚合工程

        

  聚合pom.xml (切记:<packaging>pom</packaging>)

    

 

 

    

   统一执行聚合工程的pom.xml

  

  生产真实项目maven构建介绍

继承

  pom继承是为了抽出重复配置,通常配置在父模块中,为子模块提供使用,这样可以做到“一处声明,处处使用”。

  Parent继承,消除重复配置 建立总体的父类继承工程 继承pom.xml,父类定义+子类引用

 

用IDEA建立Maven Web工程

  前提是你的IntelliJ IDEA已经配置好maven了哦!

 

 

 

  接下来,创建过程如图所示:

 

 

 

 

本文为博主原创文章,转载请注明出处!

http://www.cnblogs.com/libingbin/

感谢您的阅读。

 

posted on 2016-10-09 22:32  bingbinlee  阅读(1497)  评论(0编辑  收藏  举报