maven-1入门

微服务:架构风格(服务微化)
一个应用应该是一组小型服务;可以通过HTTP的方式进行互通;
单体应用: ALL IN ONE
微服务:每一个功能元素最终都是一个可独立替换和独立升级的软件单元;
环境约束
jdk1.8
-maven3.x
-lntelliJIDEA2017
-SpringBoot 1.5.9.RELEASE

2.目前的技术在开发中存在的问题
①一个项目就是一个工程
如果项目非常庞大,就不适合继续使用package来划分模块。最好是每一个模块对应一个工程,利于分工协作。借助于Maven就可以将一个项目拆分成多个工程。
②项目中需要的jar包必须手动“复制”、“粘贴” 到WEB-INF/lib目录下带来的问题是:同样的jar包文件重复出现在不同的项目工程中, 一方 面浪费存储空间,另外也让工程比较臃肿。
③jar包需要别人替我们准备好,或到官网下载
不同技术的官网提供jar包下载的形式是五花八门的。
有些技术的官网就是通过Maven或SVN等专门的工具来提供下载的。
如果是以不规范的方式下载的jar包,那么其中的内容很可能也是不规范的。
借助于Maven可以以一种规范的方式下载jar包。因为所有知名框架或第三方工具的jar包以及按照统一的规范存放在了Maven的中央仓库中。以规范的方式下载的jar包.内容也是可靠的。
Tips:“统一的规范”不仅是对IT开发领域非常重要,对于整个人类社会都是非常重要的。
④一个jar包依赖的其他jar包需要自己手动加入到项目中
FileUpload组件→I0组件。 commons-fileupload-1.3.jar依赖于commons-io-2.0.1.jar.
如果所有jar包之间的依赖关系都需要程序员自己非常清楚的了解,那么就会极大的增加学习成本。
Maven会自动将被依赖的jar包导入进来。

3.Maven是什么[What]
①Maven是一款服务于Java平台的自动化构建工具。
②构建
[1]概念:以"Java源文件"、”框架配置文件” 、"JSP" 、“HTML"、 “图片” 等资源为“原材料”,去“生产”一个可以运行的项目的过程。
■编译
■部署
■搭建
[2]编译: Java源文件[User.java]→+编译→Class字节码文件[User.class]→+交给JVM去执行
[3]部署:一个BS项目最终运行的并不是动态Web工程本身,而是这个动态Web工程“编译的结果”
生的鸡→处理→+熟的鸡
动态Web工程→编译、部署→ +编译结果
Tips :运行时环境

其实是一组jar包的引用,并没有把jar包本身复制到工程中所以并不是目录。

③构建过程中的各个环节
[1]清理:将以前编译得到的旧的class字节码文件删除,为下一次编译做准备
[2]编译:将Java源程序编程成class字节码文件
[3]测试:自动测试,自动调用junit程序
[4]报告:测试程序执行的结果
[5]打包:动态Web工程打war包. Java工程打jar包
[6]安装: Maven特定的概念一将打 J包得到的文件复制到"仓库”中的指定位置
[7]部署:将动态Web工程生成的war包复制到Servlet容器的指定目录下,使其可以运行

④自动化构建
4.安装Maven核心程序
①检查JAVA HOME环境变量
C:\Windows\System32> echo %JAVA_ HOME%
D:\DeviInstallNjdk1.7.0_ 07
②解压Maven核心程序的压缩包,放在一个非中文无空格路径下
D:\DevInstallapache-maven-3.2.2
③配置Maven相关的环境变量

④验证:运行mvn -v命令查看

5.Maven的核心概念
①约定的目录结构
②POM
③坐标
④依赖.
⑤仓库.
⑥生命周期/插件/目标
⑦继承
⑧聚合
6.第一个Maven工程
①创建约定的目录结构
[1]根目录:工程名
[2]src目录:源码
[3]pom.xml文件: Maven工程的核心配置文件
[4]main目录:存放主程序
[5]test目录:存放测试程序
[6]java目录:存放Java源文件
[7]resources目录:存放框架或其他工具的配置文件

②为什么要遵守约定的目录结构呢?
Maven要负责我们这个项目的自动化构建.以编译为例. Maven要想自动进行编译.那么它必须知道
Java源文件保存在哪里。
如果我们自己自定义的东西想要让框架或工具知道.有两种办法
■以配置的方式明确告诉框架

遵守框架内部已经存在的约定
约定>配置>编码
7.常用Maven命令
①注意:执行与构建过程相关的Maven命令,必须进入pom.xml所在的目录
与构建过程相关:编译、测试、打包、....
②常用命令
[1]mvn clean :清理
[2]mvn compile :编译主程序
[3]mvn test-compile :编译测试程序
[4]mvn test :执行测试
[5]mvn package :打包
[6]mvn install :安装。
[7]mvn site :生成站点
8.关于联网问题
①Maven的核心程序中仅仅定义了抽象的生命周期.但是具体的工作必须由特定的插件来完成。而插件本身
并不包含在Maven的核心程序中。
②当我们执行的Maven命令需要用到某些插件时, Maven核心程序会首先到本地仓库中查找。
③本地仓库的默认位置: [系统中当前用户的家目录]\.m2Vrepository

④Maven核心程序如果在本地仓库中找不到需要的插件,那么它会自动连接外网,到中央仓库下载。
⑤如果此时无法连接外网,则构建失败。

⑥修改默认本地仓库的位置可以让Maven核心程序到我们事先准备好的目录下查找插件
[1]找到Maven解压目录\conflsettings.xml
[2]在settings.xml文件中找到localRepository标签
[3]将<localRepository> /path/to/local/repo< /localRepository>从注释中取出
[4]将标签体内容修改为已经准备好的Maven仓库目录

9.POM
①含义: Project Object Model项目对象模型
DOM Document Object Model文档对象模型
②pom.xml对于Maven工程是核心配置文件,与构建过程相关的一切设置都在这个文件中进行配置。
重要程度相当于web.xml对于动态Web工程
10.坐标
Maven的坐标
使用下面三个向量在仓库中唯一定位一个Maven工程
[1]groupid :公司或组织域名倒序+项目名
<groupid> com.atguigu.maven</groupid>
[2]artifactid :模块名
< artifactid> Hello</artifactid>
[3]version:版本
<version> 1.0.0</version>
Maven工程的坐标与仓库中路径的对应关系

11.仓库
①仓库的分类
[1]本地仓库:当前电脑上部署的仓库目录,为当前电脑上所有Maven工程服务
[2]远程仓库
(1)私服:搭建在局域网环境中.为局域网范围内的所有Maven工程服务
(2)中央仓库:架设在Internet上,为全世界所有Maven工程服务
(3)中央仓库镜像:为了分担中央仓库的流量,提升用户访问速度
②仓库中保存的内容: Maven工程
[1]Maven自身所需要的插件
[2]第三方框架或工具的jar包
[3]我们自己开发的Maven工程
12.依赖
①Maven解析依赖信息时会到本地仓库中查找被依赖的jar包。
对于我们自己开发的Maven工程,使用mvn install命令安装后就可以进入仓库。
②依赖的范围

[1]compile范围依赖
■对主程序是否有效:有效
■对测试程序是否有效:有效
■是否参与打包:参与
■是否参与部署:参与
■典型例子: spring-core
[2]test范围依赖
■对主程序是否有效:无效
■对测试程序是否有效:有效
■是否参与打包:不参与
■是否参与部署:不参与
■典型例子: junit
[3]provided范围依赖

■对主程序是否有效:有效
■对测试程序是否有效:有效
■是否参与打包:不参与
■是否参与部署:不参与
■典型例子: servlet-apijar
 

13.生命周期
①各个构建环节执行的顺序:不能打乱顺序,必须按照既定的正确顺序来执行。
②Maven的核心程序中定义了抽象的生命周期.生命周期中各个阶段的具体任务是由插件来完成的。
③Maven核心程序为了更好的实现自动化构建,按照这一的特点执行生命周期中的各个阶段:不论现在要执
行生命周期中的哪一个阶段,都是从这个生命周期最初的位置开始执行。

④插件和目标
[1]生命周期的各个阶段仅仅定义了要执行的任务是什么。
[2]各个阶段和插件的目标是对应的。
[3]相似的目标由特定的插件来完成。