maven第一天——入门与基本概念

一、什么是maven?

  1.概述

    核心点:项目构建、依赖管理、【更新】:源码关联

    (如何关联源码:在依赖的jar上右击 maven download source即可)

  Maven是一个项目管理和综合工具Maven提供了开发人员构建一个完整的生命周期框架。(字面意思为 专家)

    开发团队可以自动完成该项目的基础设施建设时间几乎没有,Maven使用标准的目录结构和默认构建生命周期。

   maven是Java编写的,服务于Java 的构建工具

  在多个开发团队环境的情况下,Maven可以设置在上班的路上在很短的时间内为标准。由于大部分的项目设置简单可重复使用,

    Maven的生活的开发容易,而创建报告,检查,生产和测试的自动化设置。

  学maven最重要也是最难的不是怎么配置、怎么使用maven,而是为什么使用maven,既然目前掌握的东西已经可以完成一些项目了,

那为什么还要学习maven呢? 为什么是maven而不是ant等其他构建工具? 带着这个问题我们再往下走。

    这里就不再展开 ant && 新秀gradle 等

  2.目前存在的问题

    1)一个项目只是一个工程

       如果项目非常庞大,模块众多,使用package进行划分也不便于管理,最好是一个模块对应一个工程,便于分工及管理等。

    2)使用的jar包必须手动复制——粘贴到WEB-INF/lib目录下

       同样的jar包重复出现在不同工程中,继浪费空间,又导致项目臃肿。

       使用maven将可以把jar包保存在‘仓库’中,工程只需要进行引用。

    3)jar包需要自己准备(官网下载等)

        各大官网提供的下载是五花八门的,导致下载不便(当然,去一些英文网站下载由于英语水平也导致困难/笑哭)

        而且,一些第三方提供的下载(CSDN等等)下载的内容难以保证是否正规

        当然,也有一些是直接提供maven下载的

    4)各jar包的依赖管理需要手动管理

        比如fileupload依赖于io包,如果依赖信息越来越多,手动管理将十分复杂!

        maven就会帮我们进行依赖管理

  3.项目构建

  既然maven作为一款项目构建和依赖管理的工具,那什么叫项目构建呢

  以Java源文件、框架配置文件、JSP、HTML、图片等等的资源这些“原材料”,去“生产”一个可以运行的Java程序的过程

    包含 编译、部署、搭建等过程

  这里我们需要特别注意的是工程目录编译前后的关系:

    

  //像我们访问webContent下某个文件时是无需写此目录的。build是编译后的classes

  想要查看编译后的项目目录信息,可以安装插件直接browse deployment location再找到项目文件夹(当然这一步可以手动)

  为了清晰地看清结构呢,可以复制项目(到tomcat中复制项目)到eclipse任意一个工程中展开查看,例如:

//可以看到,和webContent是没有关系的(当然,编译结果是在build目录下,可以搜索navigator视图查看)

//项目运行的不是我们编写的动态WEB工程,而是“编译”后的结果

//像rt等一些运行时环境是不在目录结构中的,只是引用

  构建的步骤:

    清理:将以前编译的旧的字节码文件删除

    编译:将源程序编译成字节码文件

    测试:关键点的自动测试,自动调用我们准备好的jUnit

    报告:测试的结果就是测试报告

    打包:动态Web工程打的是war包,Java工程打的是jar包

    安装:将打包得到的文件复制到仓库中的指定位置

    部署:将动态Web工程生成的war包复制到servlet容器目录的指定位置

二、如何使用maven

  安装maven核心程序

    1)检查:

        由于maven也是java编写的,安装之前需要检查JAVA_HOME是否正确配置 

       Echo %JAVA_HOME%:输出JAVA_HOME路径
      Java -version:查看JDK版本

 

    2)解压:

        之后我们解压核心程序:apache-maven-3.5.0-bin.zip (版本自由选择),解压好后放在一个非中文、无空格目录下

        (我这里放到F:/maven目录下)

    3)配置:

        对maven的环境变量进行配置

          a.配置MAVEN_HOME或M2_HOME(向下兼容)

          b.配置Path

            新建系统变量   MAVEN_HOME(M2_HOME亦可)  变量值:F:\maven\apache-maven-3.2.2

          编辑系统变量  Path         添加变量值: ;%MAVEN_HOME%\bin

      //当然,其实自己的电脑是可以配用户变量的(据网友回答:

      如果设置的是用户环境变量,还需要注销再登陆才生效;path中加上 C:\Windows\System32
      //settings的配置见下文补充(位置与内容)

    4)验证:运行dos命令 mvn -v;正常显示版本信息则成功。

    5)更新

    Maven的更新

         在Windows上更新Maven非常简便,只需要下载新的Maven安装文件,解压至本地目录,然后更新M2_HOME环境变量便可。

      更新注意修改的地方:环境变量的更换的配置,settings.xml中本地仓库的设置,jdk版本的设置,仓库镜像的设置,eclipse中的设置

     【更新】:我们可以将conf目录下的settings.xml文件拷贝一份到Maven本地仓库的位置(之后更换版本时就无需重复指定了),之后在eclipse中只需指定一次配置文件位置即可!

    Linux下安装可以参考https://blog.csdn.net/mynameissls/article/details/54140176

三、maven的核心概念

  1.概念

    1.约定目录结构

    2.POM

    3.坐标

    4.依赖

    5.仓库

    6.生命周期/插件/目标

    7.继承

    8.聚合

    //以上重要程度按颜色区分,以下将逐一解释介绍这些概念

      聚合、继承将在day02讲解

  2.第一个maven工程

  我们通过第一个maven工程来感性认识一下以上的概念

  ①目录结构
    Hello
    |---src
    |---|---main
    |---|---|---java
    |---|---|---resources
    |---|---test
    |---|---|---java
    |---|---|---resources
    |---pom.xml

  1)创建约定目录结构

    根目录——工程名

      src目录——源码

        main——主程序

        test——测试程序

          java——java源文件

          resources——框架或其他工具的配置文件等

      pom.xml文件——maven的核心配置文件

  2)为什么要遵循约定目录结构

    maven作为自动化构建工具,比如它要编译,它就需要知道编译的路径,按照约定,maven才能智能地为我们服务

    要想让maven知道我们自定义的结构,我们可以:

      使用配置文件

      遵循约定

    一般情况下:约定优于配置

   接下来我们来建立这个maven工程

    在WORKPLACE下新建Hello文件夹

    在Hello文件夹下新建src文件夹和pom.xml配置文件

      配置文件这里暂时不展开,后续补充:

<?xml version="1.0" ?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.atguigu.maven</groupId>
    <artifactId>Hello</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <name>Hello</name>
      
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
View Code

     在src下建立main和test

    在man和test下建立 java 和 resources文件夹

    在src/main/java/com/atguigu/maven目录下新建文件Hello.java,内容如下:

package com.atguigu.maven;
        public class Hello {
            public String sayHello(String name){
                return "Hello "+name+"!";
            }
        }
View Code

    在/src/test/java/com/atguigu/maven目录下新建测试文件HelloTest.java:

package com.atguigu.maven;    
        import org.junit.Test;
        import static junit.framework.Assert.*;
        public class HelloTest {
            @Test
            public void testHello(){
                Hello hello = new Hello();
                String results = hello.sayHello("litingwei");
                assertEquals("Hello litingwei!",results);    
            }
        }
View Code

    运行maven的常用命令:

        mvn compile 编译
      mvn clean 清理
      mvn test 测试
      mvn package 打包

       mvn install 安装(能做得事情最多,从清理开始进行,所以比较常用)
      ※注意:运行Maven命令时一定要进入pom.xml文件所在的目录!

如何进入目录?:

(其实不用每次重开cmd,再转换路径。直接在要用的路径下按住shift,右键点击弹出的菜单中就可以直接打开一个cmd窗口且路径指向)

//清屏:cls

  联网问题:执行maven命令需要插件时会先在本地仓库查找【当前用户家目录:C\用户\用户名 这个目录,可以看到.m2文件夹】,

        未找到时,会自动连接外网到中央仓库下载,也就是这里的downloading...(第二次运行时不会重复下载)

  修改本地仓库路径:

    当然,在c盘我们是不太乐意的,我们希望把它改为自定义的本地仓库目录

     找到maven解压目录:conf\settings.xml

      找到 localRepository 标签 (当然,这里是注释的,直接改无效)

      

      把它从注释里放出来,改为我们准备好的目录即可:

    

    测试几个常用的mvn命令可以看到目录下生成的对应的文件:(target是maven生成的目标文件夹,包含编译好的class文件)

 //包含一些类似的打包文件等

 如何更换maven国内镜像,解决Maven下载慢的问题请参见:http://blog.csdn.net/a992036795/article/details/53161344

 慕课网友推荐的:

<mirror>

      <id>alimaven</id>

      <name>aliyun maven</name>

      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>

      <mirrorOf>central</mirrorOf>        

    </mirror>
View Code

 

  3.pom的概念

    什么是pom?
     POM(Project Object Model) 是Maven的基础。它是一个XML文件,包含了Maven用来build项目所需要的项目配置的信息。

  pom部分的展开请分别参见网友博文:

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

    http://www.cnblogs.com/sharpest/p/5969566.html

  4.坐标的概念

    什么是坐标?

    数学中坐标的概念:使用(x,y)或(x,y,z)可以定义平面或空间中的唯一一个点

    maven中坐标的概念:使用以下三个向量定位唯一的一个工程:

       groupId:团体,公司,小组,组织,项目,或者其它团体。团体标识的约定是,

            它以创建这个项目的组织名称的逆向域名(reverse domain name)开头+项目名

            公司域名逆序+项目名

            (其它博友的说法:通常是 包名

       artifactId:在groupId下的表示一个单独项目的唯一标识符。也就是一个模块名称。

       version:

               一个项目的特定版本。
                发布的项目有一个固定的版本标识来指向该项目的某一个特定的版本。而正在开发中的项目可以用一个特殊的标识,这种标识给版本加上一个“SNAPSHOT”的标记。
        
        pachaging:(不是坐标唯一标识,可选)
                项目的类型,默认是jar,描述了项目打包后的输出。类型为jar的项目产生一个JAR文件,类型为war的项目产生一个web应用。
       
       综上呢,“gav”就是指maven坐标的简写(按照从大到小递进的顺序)
            仓库中的目录与坐标是成对应关系的
        这是坐标值:
  <groupId>com.atguigu.maven</groupId>
    <artifactId>Hello</artifactId>
    <version>0.0.1-SNAPSHOT</version>

        以连接起来的字符串作为目录结构到仓库中查找:

    com/atguigu/maven/Hello/0.0.1-SNAPSHOT/Hello-0.0.1SNAPSHOT.jar

      这里就不用文字来进行描述了(也不方便描述),就是g/a/v/a-v.jar (只有版本号中的.不用变 / )

    【更新】大致为:groupId/artifactId/version/artifactId-version.packaging

  5.仓库的概念

    本地仓库:当前电脑上部署的仓库,为当前电脑上的所有maven工程服务

    远程仓库:

       私服:搭建在局域网环境中,为局域网中的maven工程服务。(我们所说的私服通常是Nexus)

  //先在私服上找,找不到会帮你去中央仓库等找再保存在私服(解决maven联网等一些问题)

       中央仓库:架设在Internet上,为全网所有的maven工程服务

       中央仓库的镜像:为了分担中央仓库的流量,减轻中央仓库的压力,提升访问速度

    仓库中保存的内容:maven工程

        1)maven工程所需要的插件

        2)第三方框架或工具的jar包

        3)我们自己开发的工程

     在介绍最重要的依赖之前,我们先来建立我们的第二个maven工程,一方面是强化我们对maven工程目录结构的理解,一方面是引出依赖的概念

  (仓库的配置见上文中修改本地仓库的描述)

  6.第二个maven工程

     ①工程名:HelloFriend (依旧是在WROKPLACE下建立)
    ②目录结构与第一个Maven工程相同
    ③POM文件

<?xml version="1.0" ?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.atguigu.maven</groupId>
    <artifactId>HelloFriend</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>HelloFriend</name>
    
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.0</version>
            <scope>test</scope>
        </dependency>        
        
        <dependency>
            <groupId>com.atguigu.maven</groupId>
            <artifactId>Hello</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
        
    </dependencies>
</project>
View Code

 这里添加了对Hello工程的依赖

 //后面会贴出所有工程的操作指南

  could not found 异常:

    对于我们自己开发的maven工程,执行install命令后,工程就会进入仓库,其它工程对它的依赖才能生效

            mvn install 安装

    此时安装完成后,HelloFriend对Hello的依赖就能正常编译了

    7.依赖的概念

  依赖的范围(pom中scope的范围),我们常用的三个:

  主要是用于依赖对三种 classpath (编译、测试、运行)的控制:

    compile(默认):

      对主程序是否有效 (main):有效

      对测试程序是否有效 (test):有效

      是否参与打包:参与

      是否参与部署:参与

     (典型应用:spring-core)

    test: 

      对主程序是否有效:无效

      对测试程序是否有效:有效

      是否参与打包:不参与 

      是否参与部署:不参与

      (典型应用是jUnit)

    provided:

      对主程序是否有效:有效

      对测试程序是否有效:有效

      是否参与打包:不参与 

      是否参与部署:不参与

      (只在开发阶段,典型例子是servletAPI,服务器上存在,实际跑时不需要部署)

    8.生命周期的概念

      什么是生命周期?

        各个构建环节执行的顺序不能打乱,必须按照既定的顺序,这个顺序就是maven的生命周期

      maven的核心程序中定义了抽象的生命周期,生命周期的各个阶段的具体任务是由插件来完成的

      详细的生命周期可以参见网友博客:http://www.cnblogs.com/luotaoyeah/p/3819001.html

      不论执行哪个阶段,都会从头开始执行,这也是为了更好的实现自动化构建。

        例如:执行打包时,会从编译等开始一直执行到打包。

      插件等信息也可以参见上述博文。

四、在eclipse中使用maven插件 

  一般eclipse中都自带了maven插件,无需安装

  当然了,还有如下两个地方需要我们配置后才能正常使用:

  installatons:maven核心程序的位置(使用我们自己下载解压的)

  我们点击 add ,进行添加:

//添加完成后勾选我们添加的maven即可

  usersettings: 指定conf/settings.xml的位置,进而获取本地仓库的位置

  这样,点击 apply ,点击ok,就完成了。

【更新】:如何下载关联源码:

  

 

posted @ 2017-06-01 08:55  ---江北  阅读(383)  评论(0编辑  收藏  举报
TOP