跟我1小时搞定Maven是什么?怎么用?

    本文原先发表与博客园(http://www.cnblogs.com/libingbin/p/6104588.html ),不过个人博客园已经再也不更新了,原有博文会逐步迁移的。html

 

序言

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

基础概述

  Maven能干吗呢?spring

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

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

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

 

 

怎样下载、安装、配置

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

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

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

  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了哦!

 

 

 

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

 

 

 

 

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

相关文章
相关标签/搜索