一、什么是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>

     在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+"!";
}
}

    在/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);
}
}

    运行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>

  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>

 这里添加了对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,就完成了。

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

  

maven第一天——入门与基本概念的更多相关文章

  1. Ajax第一天——入门与基本概念

    什么是Ajax Ajax被认为是(Asynchronous JavaScript and XML的缩写).异步的js和xml 异步和同步:同步->类似打电话,接完一个再接下一个:异步:-> ...

  2. Flink入门-第一篇:Flink基础概念以及竞品对比

    Flink入门-第一篇:Flink基础概念以及竞品对比 Flink介绍 截止2021年10月Flink最新的稳定版本已经发展到1.14.0 Flink起源于一个名为Stratosphere的研究项目主 ...

  3. .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9977862.html 写在前面 千呼万唤始出来,首先,请允许我长吸一口气!真没想到一份来自28岁老程序员 ...

  4. net core体系-web应用程序-4asp.net core2.0 项目实战(CMS)-第一章 入门篇-开篇及总体规划

    .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划   原文地址:https://www.cnblogs.com/yilezhu/p/9977862.html 写在前面 千呼万唤始出来 ...

  5. 第一篇 入门必备 (Android学习笔记)

    第一篇 入门必备 第1章 初识Android 第2章 搭建你的开发环境 第3章 创建第一个程序--HelloWorld 第4章 使用Android工具   ●Android之父 Android安迪·罗 ...

  6. idea---搭建maven,tomcat入门

    这篇随笔讲讲idea工具的安装和使用和在idea中搭建maven的分享. 一.概念 1.IntelliJ IDEA是什么? DEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境. ...

  7. 学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳

    学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 9 / 25 转载请注明出处!️ 目录 学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳 ...

  8. Maven使用--基本入门

    maven学习(上)- 基本入门用法 转载自:https://www.cnblogs.com/yjmyzz/p/3495762.html 参考: http://www.cnblogs.com/dave ...

  9. PRML读书会第一章 Introduction(机器学习基本概念、学习理论、模型选择、维灾等)

    主讲人 常象宇 大家好,我是likrain,本来我和网神说的是我可以作为机动,大家不想讲哪里我可以试试,结果大家不想讲第一章.估计都是大神觉得第一章比较简单,所以就由我来吧.我的背景是统计与数学,稍懂 ...

随机推荐

  1. Mac下驱动BCM20702A0 USB蓝牙

    偶然高了一个USB蓝牙,查到Mac下能识别,无法驱动,就去找了一下.方法很简单,就是把蓝牙的PID和VID加入到驱动里边去,具体方法和步骤如下: 1. 进入到/System/Libary/Extens ...

  2. linux ubuntu 本地镜像 软件源 制作方法

    1.配置当前软件源,镜像非常大,所以首先要配置一下载速度快的软件源http://fffo.blog.163.com/blog/static/2119130682014322104136601/2.安装 ...

  3. 使用 Azure CLI 创建和管理 Linux VM

    Azure 虚拟机提供完全可配置的灵活计算环境. 本教程介绍 Azure 虚拟机的基本部署项目,例如选择 VM 大小.选择 VM 映像和部署 VM. 你将学习如何执行以下操作: 创建并连接到 VM 选 ...

  4. sql server 查询ntext字段长度

    DATALENGTH 返回任何表达式所占用的字节数. 语法 DATALENGTH ( expression ) 参数 expression 任何类型的表达式. 返回类型 int 注释 DATALENG ...

  5. Flask的数据库连接池 DBUtils

    Flask是没有ORM的操作的,如果在flask中连接数据库有两种方式 一.pymysql 二.SQLAlchemy 是python操作数据库的以一个库,能够进行orm映射官网文档 sqlchemy ...

  6. UNIX高级环境编程(3)Files And Directories - stat函数,文件类型,和各种ID

    在前面的两篇,我们了解了IO操作的一些基本操作函数,包括open.read和write. 在本篇我们来学习一下文件系统的其他特性和一个文件的属性,涉及的函数功能包括: 查看文件的所有属性: 改变文件所 ...

  7. Alpha 冲刺报告(3/10)

    Alpha 冲刺报告 队名:洛基小队 峻雄(组长) 已完成:开始编写角色的移动脚本 明日计划:继续学习并进行脚本编写 剩余任务:物品背包交互代码 困难:如何把各个模块的脚本整合起来 --------- ...

  8. javascript 的MD5代码备份,跟java互通

    var MD5 = function (string) {                   function RotateLeft(lValue, iShiftBits) {            ...

  9. 小白学svn

    该博客是本人第一次在自己的电脑中部署svnserver后的一些心得,希望对小白们有所帮助.尽管本人之前有使用svn开发的经验,可是那都是使用百度开发人员平台的,我一直以为在自己的电脑中弄svnserv ...

  10. ubuntu18.04 mariadb start失败

    在Ubuntu 安装mariadb 再restart 后出现错误 journalctl -xe 发现 apparmor权限问题 AppArmor 是一款与SeLinux类似的安全框架/工具,其主要作用 ...