简介
为什么要使用Maven
在开发过程中,相信大家或多或少都会感觉在一些配置的方面比较繁琐,比如说
-
一个项目就是一个工程
如果项目非常庞大,就不适合使用package 划分模块,最好是每一个模块对应一个工程,利于分工协作。
借助于Maven 就可以将一个项目拆分为多个工程 -
项目中需要的jar包必须手动复制粘贴到/lib目录下
带来问题:同样的jar包重复出现在不同的项目工程中,一方面浪费存储空间,另一方面让工程比较臃肿
借助Maven,可以将jar包仅仅保存在“仓库中”,有需要使用的工程“引用” 这个文件接口,并不需要将jar 包赋值过来。 -
jar包需要别人替我们准备好,或到官网下载
不同技术的官网提供jar 包下载的形式是五花八门的。
有些技术的官网就是通过Maven 或者SVN 等专门的工具下载的。
如果是以非正式方式下载的jar包,那么其中的内容很可能也是不规范的。
借助于Maven 可以以一种规范的方式下载jar包,因为所有知名度框架或第三方工具的jar 包已经按照统一的规范放在Maven 的中央仓库中,以规范的方式下载的jar 包,内容也是可靠的。Tips:“统一的规范”,不仅是对IT开发领域非常重要,对于整个个人类社会都是非常重要的。
-
一个jar包依赖的其它jar包需要自己手动加入到项目中
Maven 会自动将被依赖的jar 包导入进来。
Maven(妹吻)是什么
- Maven是一款服务于Java 平台的自动化构建工具
-
Make->Ant->Maven->Gradle
2.构建 -
构建 != 创建
概念:“以”java源文件”,“框架配置文件”,“JSP”,“HTML”,“图片”等资源为原材料,去“生产”一个可以与逆行的项目的过程编译:java源文件->编译->Class字节码文件->交给JVM去执行
部署:一个BS项目最终运行的并不是动态的Web 工程本身,而是这个动态Web 工程“编译的结果”,
生的鸡 ->处理 -> 熟的鸡
动态Web 工程 - >编译,部署- >编译结果Tips: 运行时环境其实是一组jar 包的引用,并没有把jar 包本身复制到工程中,所以并不是目录
-
配置Maven 相关的环境变量
查看jdk配置
添加用户变量
配置环境变量
配置完成后:
输入mvn -v,出现下面提示,安装成功
Maven 的核心概念
- 约定的目录结构
- POM
- 坐标
- 依赖
- 仓库
- 生命周期/插件/目标
- 继承
- 聚合
目录结构
-
创建约定的目录结构
- 根目录:工程名
- src目录: 源码
- pom.xml 文件:Maven 工程的核心配置文件
- main 目录:存放主程序
- test 目录:存放测试程序
- java 目录:存放Java 源文件
- resources 目录:存放框架或其它工具的配置文件
-
为什么要遵守约定的目录结构
- Maven 要负责我们这个项目的自动化构建,以编译为例,Maven 要想自动进行编译,那么它必须知道Java 源文件保存在哪里。
- 如果我们自己定义的东西要让框架或者工具知道,有两种方法
- 以配置的方式明确告诉框架:
- 遵守框架内部已经存在的约定
常用Maven 命令
[1] mvn clean : 清理
[2] mvn compile : 编译主程序
[3] mvn test-compile : 编译测试程序
[4] mvn test : 执行测试
[5] mvn package : 打包
[6] mvn install : 安装
[7] mvn site : 生成站点
注意:执行与构建过程相关的Maven 命令,必须进入pom.xml 所在的目录
右键点击pom.xml文件,点击show in explorer会显示文件所在目录
然后直接在地址栏输入cmd
关于联网问题:
1. Maven 的核心程序中仅仅定义了抽象的生命周期,但是具体的工作必须由特定的插件来完成。而插件本身并不包含在Maven 的核心程序中。
2. 当我们执行的命令需要用到某些插件时,Maven 核心程序会首先到本地仓库中查找
3. 本地仓库的默认位置[系统中当前用户的家目录].m2\repository
POM
含义: Project Object Model 项目模型
DOM:Document Object Model 文档对象模型
pom.xml 对于Macen 工程是核心配置文件,与构建过程相关的一切设置都在这个文件中进行配置,重要程度相当于web.xml 对于动态Web 工程。
坐标
使用下面三个向量在仓库中唯一定位一个Maven 工程
[1] groupid : 公司或组织域名倒序 + 项目名
[2] artifactid : 模块名
[3] version : 版本
仓库
-
仓库分类
- 本地仓库:当前电脑上部署的仓库目录,为当前电脑上所有Maven 工程服务
本地仓库的默认位置[系统中当前用户的家目录]\.m2\repository
- 远程仓库:
- 私服:搭建在局域网环境中,为局域网范围内的所有Maven 工程服务
- 中央仓库:假设在Internet上,为全世界所有Maven 工程服务
- 中央仓库镜像:为分担中央仓库的流量,提升用户访问速度
- 本地仓库:当前电脑上部署的仓库目录,为当前电脑上所有Maven 工程服务
-
仓库中保存的内容: Maven 工程
- Maven 自身所需要的矿建
- 第三方框架或工具的jar 包
- 我们自己开发的Maven 工程
依赖
-
Maven解析依赖信息时会到本地仓库中查找被依赖的jar 包
对于我们自己开发的Maven 工程,使用mvn install 命令安装后就可以进入仓库 -
依赖的范围
[1] compile范围依赖- 对主程序有效
- 对测试程序有效
- 参与打包
- 参与部署
- 典型例子 spring-core
[2] test 范围依赖
- 对主程序无效
- 对测试程序有效
- 不参与打包
- 不参与部署
- 典型例子 junit
[3] provided 范围依赖
- 对主程序有效
- 对测试程序有效
- 不参与打包
- 不参与部署
- 典型例子 servlet-api.jar
生命周期
- 各个构建环节执行的顺序:不能打乱顺序,必须按照既定的正确顺序来执行
- Maven 的核心程序中定义了抽象的生命周期,生命周期中各个阶段的具体任务是由插件来完成的
- Maven核心程序为了更好的实现自动化构建,按照这一特点执行生命周期中的各个阶段:不论现在要执行生命周期中的哪一个阶段,都是从这个生命周期最初的位置开始执行。
第一个Maven工程
配置setting.xml
在maven安装目录下新建一个repository
文件夹:
复制文件夹地址,打开setting.xml 文件,配置仓库路径:
配置idea
打开File ⇒ Setting
选择Runner
在VM Options中输入:
-DarchetypeCatalog=internal
创建一个新工程
选择Maven项目,右侧是已经创建好的Maven骨架,使用骨架的条件是联网或者配置好了使用本地骨架的属性。
使用骨架创建:
使用骨架的话要勾选 Create from archetype
然后选择maven-archetype-quickstart
,这是idea为maven提供的创建Java的骨架
点击Next:
点击Next:
不使用骨架创建:
创建的工程如下:
使用骨架创建web工程:
找到webapp骨架:
其它功能
从中央仓库寻找jar包
maven中央仓库:https://mvnrepository.com/
搜索需要用到的jar包名称
点击对应的版本:
再选择需要的版本型号:
选择Maven,再将仓库坐标复制到pom.xml 中。
防止jar包冲突
设置jar包作用域:
<scope>provided</scope>
运行环境修改
tomcat
添加插件:
<project>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</build>
</project>
这里的groupId并不会自动提示,如果记不住
打开File=> Setting,搜索 live
我创建一个组:
创建模板组后,在模板组中添加一个模板:
现在输入tomcat,会有提示,回车就可以自动输入:
JDK模板定制
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<target>1.8</target>
<source>1.8</source>
<encoding>UTF-8</encoding>
</configuration>
</plugin>