在使用Maven之前必须配置好Maven的环境变量及jdk 的环境变量:

如何篇配置Maven环境变量以及安装eclipse中Maven的镜像

一、为什么要使用Maven

目前技术在开发中存在的问题:

① 一个项目就是一个大工程
如果项目非常庞大,就不适合用package来划分。最好是一个功能就是一个模块,利于分工协作。借助Maven就可以将一个项目拆分成多个模块。
②项目所需的jar包和jar包之间的依赖包必须自己提前准备好
如果是以不规范的方式下载的jar包,那么可能会带来问题。借助于Maven,只需要安装Maven的仓库到本地即可,因为所有知名框架的jar包都保存在Maven的中央仓库中,可以以一种规范的方式得到jar包。
③jar包都需要手动添加到lib目录中
带来的问题:同样的jar包出现在每个工程中,一方面浪费空间,另外工程变得臃肿。借助Maven可以直接将jar包保存在仓库中,有需要的工程可以通过配置pom.xml引入这个jar包,不需把jar包复制过来。

二、Maven是什么

Maven是一款专门服务于JAVA的自动化构建工具,并不能直接理解为我们找jar包的工具。那么自动化构建又是什么?

我把Web工程的构建分为了两步:1.编译 2.部署
1.编译 源码通过java编译器编译成字节码文件的过程。
2.部署 一个B/S项目最终运行的并不是项目本身,而是这个动态web工程“编译的结果”。就像一个java程序最终运行的并不是java的文件,而是编译后的.class文件。

Maven自动化构建过程的具体步骤

①清除:清理上次的编译结果
②编译:将java文件编译成class文件
③测试:调用Junit自动测试,测试完后打印测试的结果
④打包:java工程打jar包,web工程打成war包
⑤安装:把不是maven库中的,自己写的工程,模块之间有需要依赖的模块,安装到maven仓库中。
⑥部署:将动态的web工程打成的war包部署到服务器中,使其可以运行。
以上步骤全部可以交由Maven通过maven命令去自动执行。

三、Maven怎样使用

Maven的学习路线

①约定的目录结构
②坐标的概念
③maven仓库的概念

④依赖怎样使用

  • 依赖的传递性
  • 系统选择依赖时的就近原则

⑤继承和聚合的概念和使用

①约定的目录结构

若想使用Maven,那么就必须按照Maven约定的目录结构创建项目(可在eclipse中new一个Maven项目直接形成约定的目录结构)

  • 为什么要遵守约定?
    因为Maven负责整个工程的自动化构建,只有这样Maven才能读到工程里的文件,进行编译、测试、打包等工作。

  • 我们自己定义的东西如何让框架知道?
    ①遵守框架的约定:比如要使用log4j的jar包,你得按照他的规定创建log4j.properties,一个字母一个字母的不能出错。
    ②以配置的方式告诉框架:如在web.xml中配置spring,指明spring的配置文件的路径。

②坐标的概念

概念:很简单,就像x坐标和y坐标可以唯一标识一个平面中的点。一个maven中的坐标唯一标识一个Maven仓库中的jar包。所以若想使用某个jar包,你只需知道他的坐标,配置在pom.xml中即可。

使用坐标必须按照maven的“gav”格式:
Ⅰ groupId:公司或组织的域名倒叙+项目名

<groupId>com.sms.maven</groupId>

Ⅱ artifactId:模块名

<artifactId>Hello</artifactId>

Ⅲ version:版本号

<version>1.0.0</version>

比如spring-core的坐标:

<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.0.RELEASE</version>

③maven仓库的概念

概念:仓库=自动化构建所需的插件+所有知名框架的jar包+我们自己开发的maven模块(使用mvn -stall进入仓库)

仓库的分类

  • 本地仓库:自己电脑上已经部署好的maven仓库,需要去网上下载。
  • 私服:搭建在局域网中,为局域网中的maven项目服务。
  • 中央仓库:搭建在Internet中,为世界上所有的maven项目服务。

④依赖如何使用(jar包如何从仓库中引入?)

概念:在pom.xml配置依赖,就是给出坐标,引入jar包/其他模块的过程
配置依赖:把jar包或模块的坐标写在dependency标签中
maven解析配置好的依赖:maven到本地仓库中查找被依赖的jar包的过程
  • 依赖之间相互传递
    如果现在有这三个模块,其中HelloFriend需要使用到Hello模块里的类,MakeFriends需要使用到HelloFriend模块里的类。
    依赖关系:MakeFriends—>HelloFriend—>Hello

    若Hello模块中配置了spring-core的jar包,那么在HelloFriend和MakeFriends中都会包含spring-core的运行时环境。即都会包含下图中的jar包:

  • 怎样排除依赖
    当我们接受到传递过来的依赖关系时,如果有不希望使用在当前工程中的jar包,我们可以排除他。排除的方式:

  • 系统选择依赖时的就近选择
    同样是这三个模块,依赖关系:MakeFriends—>HelloFriend—>Hello

    如果Hello模块中使用到log4j-4.0的版本,而HelloFriend模块使用到log4j-4.9的版本,那么MakeFriends模块中该如何选择依赖过来的的版本?
    答案:选择HelloFriend模块中log4j的版本。因为就近原则,MakeFriends到HelloFriend模块是一步,到Hello模块是两步。

⑤继承和聚合的使用

继承的使用情景: 同样是这三个模块,依赖关系:MakeFriends—>HelloFriend—>Hello,但是由于test的依赖范围不可传递,每一个模块依赖的Junit的版本号不相同。那么怎么统一管理Junit的版本?
答案:此时就需要一位“父亲”,将Junit的依赖统一提取到父亲中,在子工程中的Junit依赖不声明版本号,以父亲设定的为准。
操作步骤:
① 创建一个Maven工程作为父工程,注意:打包方式为pom

②在父工程中统一管理Junit的版本,声明为4.9

  <dependencyManagement><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.9</version><scope>test</scope></dependency></dependencies></dependencyManagement>

③“认爹仪式”,在子工程中声明对父工程的引用

<parent><groupId>com.sms.maven</groupId><artifactId>Parent</artifactId><version>0.0.1-SNAPSHOT</version><!-- 以当前子工程为基准找到父工程pom.xml的路径 --><relativePath>../Father/pom/xml</relativePath></parent>

④去掉子工程的坐标和父工程的重复部分。
⑤去掉子工程中Junit依赖的版本号。

聚合的使用场景: 需要一件安装所有模块到仓库时,使用聚合。
配置方式: 在总的聚合工程中,配置各个参与聚合的模块。

  <modules><module>../Hello</module><module>../HelloFriend</module><module>../MakeFriends</module></modules>

Maven教程详细总结+学习路线相关推荐

  1. Python学习教程(Python学习路线):Day08-面向对象编程基础

    Python学习教程(Python学习路线):面向对象编程基础 活在当下的程序员应该都听过"面向对象编程"一词,也经常有人问能不能用一句话解释下什么是"面向对象编程&qu ...

  2. Python学习教程(Python学习路线):Day14A-网络编程入门

    Python学习教程(Python学习路线):网络编程入门 计算机网络基础 计算机网络是独立自主的计算机互联而成的系统的总称,组建计算机网络最主要的目的是实现多台计算机之间的通信和资源共享.今天计算机 ...

  3. python两层循环 循环完整体一个_Python学习教程(Python学习路线):Python编写循环的两个建议...

    原标题:Python学习教程(Python学习路线):Python编写循环的两个建议 Python学习教程(Python学习路线):给大家总结了两个Python编写循环的建议 循环是一种常用的程序控制 ...

  4. Python学习教程(Python学习路线):Python面试100题(二)

    Python学习教程(Python学习路线):面试题接着给大家整理! 16.<div class="nam">中国</div>,用正则匹配出标签里面的内容( ...

  5. Python学习教程(Python学习路线):Python3之递归函数简单示例

    Python学习教程(Python学习路线):Python3之递归函数简单示例 概述 递归函数即直接或间接调用自身的函数,且递归过程中必须有一个明确的递归结束条件,称为递归出口.递归极其强大一点就是能 ...

  6. Python学习教程(Python学习路线):第12天—正则表达式

    Python学习教程(Python学习路线):正则表达式相关知识 在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要,正则表达式就是用于描述这些规则的工具,换句话说正则表达式是 ...

  7. python sorted下标_Python学习教程(Python学习路线):第七天-字符串和常用数据结构

    Python学习教程(Python学习路线):字符串和常用数据结构 使用字符串 第二次世界大战促使了现代电子计算机的诞生,当初的想法很简单,就是用计算机来计算导弹的弹道,因此在计算机刚刚诞生的那个年代 ...

  8. Python学习教程(Python学习路线):Day13-进程和线程

    Python学习教程(Python学习路线):进程和线程 今天我们使用的计算机早已进入多CPU或多核时代,而我们使用的操作系统都是支持"多任务"的操作系统,这使得我们可以同时运行多 ...

  9. Python学习教程(Python学习路线_Python基础学习教程_Python视频教程):初学者新手怎样快速入门Python

    Python学习教程(Python学习路线_Python基础学习教程_Python视频教程):初学者新手怎样快速入门Python? 人生苦短,我用Python!!!短短几个字,现在在各大学习类平台随处 ...

最新文章

  1. vlookup示例_VLOOKUP示例–如何在Excel中执行VLOOKUP
  2. 基于 CNN 特征区域进行目标检测
  3. 能量平衡_巴夏:平衡自己的能量,疗愈自己,疗愈世界
  4. java判断时间是不是星期五_Java判断当前日期是星期几
  5. C语言——日常刷题(一)
  6. linux实验串行端口程序设计,Linux下串口编程心得(转)
  7. Android 中文API (46) —— SimpleAdapter
  8. leetcode-110:判断平衡二叉树 Java
  9. [转载]帮你入门 详解JRE和JDK的区别
  10. 开源项目面试重要吗_您的开源故事很重要
  11. Zilliqa的设计构思 第1部分:网络分片
  12. SegmentFault D-Day 2016 年度总结报告
  13. mes选型与实施指南_六大类型MES企业大盘点告诉你如何选择正确选择MES
  14. android Settings之辅助功能
  15. php snappy,php – 使用Knp Snappy生成pdf文件时出现错误字符
  16. Linux进程管理四大工具ps \dstat\ top\ htop
  17. mac改变ipv4地址无法上网
  18. SpringBoot整合Redis实现优惠券秒杀服务(笔记+优化思路版)
  19. innerHTML 用法
  20. python语言在哪些控制结构中使用else_一文看懂Python的控制结构:For、While、If…都有了...

热门文章

  1. MATLAB中GUI设计的基本操作
  2. 【android-tips】SurfaceView的制作android游戏框架介绍
  3. Linux CentOS PhpMyAdmin安装--转载
  4. xss攻击汇总--转
  5. 康奈尔大学王飞博士:AI处理医疗数据面临的8大挑战
  6. 勿谈大,且看Bloomberg的中数据处理平台
  7. 从0到1建立一张评分卡之可视化分析
  8. 白话Elasticsearch69-ES生产集群部署重要的 Elasticsearch参数设置
  9. 实战SSM_O2O商铺_36【商品】商品列表之Dao+Service+Controller层的实现
  10. 学习笔记——sklearn监督学习:回归(简单数学知识罗列)