目前的技术在开发中存在的问题
- 一个项目就是一个工程
- 如果一个项目非常庞大,就不适合继续使用package来划分模块。最好是每一个模块对应一个工程,利于分工协作。借助于Maven就可以将一个项目分成多个工程。
- 项目中需要的jar包必须手动“复制”、“粘贴”到WEB-INF/lib目录下
- jar包需要别人替我们准备好,或到官网下载
- 一个jar包依赖的其他jar包需要自己手动加入到项目中
安装Maven核心程序
-
检查JAVA_HOME环境变量
命令行输入 echo %JAVA_HOME% -
解压Maven核心程序的压缩包,放在一个非中文无空格的路径下
-
配置Maven相关的环境变量
- MAVEN_HOME或M2_HOME(为了向下兼容,避免一些问题)
- 一般HOME的环境变量都是bin目录的上一级,path是带bin目录的
- path
- MAVEN_HOME或M2_HOME(为了向下兼容,避免一些问题)
-
验证:运行mvn -v 查看Maven版本
-
Maven的核心概念
- 约定的目录结构
- POM
- 坐标
- 依赖
- 仓库
- 生命周期/插件/目标
- 继承
- 聚合
-
第一个Maven工程
- 创建预定的目录结构
- 根目录(工程名)
- src (源码)
- main (存放主程序)
- java (存放Java源文件)
- resources (存放框架或其他工具的配置文件)
- test (存放测试程序)
- java(存放Java源文件)
- resources (存放框架或其他工具的配置文)
- main (存放主程序)
- pom.xml (Maven工程的核心配置文件)
- src (源码)
- 根目录(工程名)
- 为什么要遵守约定的目录结构
- Maven要负责项目的自动化构建,它必须知道文件保存在哪
- 如果自己定义的东西想让框架或工具知道,有两种方法:
- 以配置的方式明确告诉框架
- 遵守框架内部已存在的约定
- 约定 > 配置 > 编码
- 创建预定的目录结构
-
常用Maven命令
- 注意:执行与构建过程相关的Maven命令,必须进入pom.xml所在的目录。
- 与构建过程相关: 编译、测试、打包...
- 常用命令
- mvn clean : 清理
- mvn compile : 编译主程序
- mvn test-compile : 编译测试程序
- mvn test : 执行测试
- mvn package : 打包
- mvn install : 安装
- mvn site : 生成站点
- 注意:执行与构建过程相关的Maven命令,必须进入pom.xml所在的目录。
-
关于联网问题
- Maven的核心程序中仅仅定义了抽象的生命周期,但具体的工作必须由特定的插件来完成。而插件本身并不包含在Maven的核心程序中。
- 当我们执行的Maven命令需要用到某些插件时,Maven核心程序会首先到本地仓库中查找。
- 本地仓库的默认位置:[系统中当前用户的家目录].m2\repository
C:\Users[登录当前系统的用户名].m2\repository
- 本地仓库的默认位置:[系统中当前用户的家目录].m2\repository
- Maven核心程序如果在本地仓库中找不到需要的插件,那么它会自动连接外网,到中央仓库下载。如果无法连接外网,则构建失败。
- 修改本地仓库的默认位 置:
- 找到Maven解压目录\conf\settings.xml
- 在settings.xml文件中找到localRepository标签
- 将
/path/to/local/repo 从注释中取出 - 将标签体内容修改:
E:\app\aboutJava\maven\RepMaven
-
POM
- 含义:Project Object Model 项目对象模型
- pom.xml对于Maven工程是核心配置文件,与构建过程相关的一切设置都在这个文件中进行配置。重要程度相当于web.xml对于动态Web工程
-
坐标
- 数学中的坐标:
- 在平面上,使用X、Y两个向量可以唯一的定位平面中的任何一个点。
- 在空间上,使用X、Y、Z三个向量可以唯一的定位空间中的任何一个点。
- Maven中的坐标
使用下面三个向量在仓库中唯一定位一个Maven工程- groupId:公司或组织域名倒序+项目名
com.atguigu.maven
- artifactId:
Hello
- version
1.0.0
- groupId:公司或组织域名倒序+项目名
- Maven工程的坐标与仓库中路径的对应关系
- 坐标:
org.springframework
spring-core
4.0.0.RELEASE - 路径:
org/springframework/spring-core/4.0.0.RELEASE/spring-core-4.0.0.RELEASE.jar
- 坐标:
- 数学中的坐标:
-
仓库
- 仓库的分类:
- 本地仓库:当前电脑上部署的仓库目录,为当前电脑上所有的Maven工程服务
- 远程仓库
- 私服:搭建在局域网环境中,为局域网范围内的所有Maven工程服务
- 中央仓库:架设在Internet上,为全世界所有Maven工程服务
- 中央仓库镜像:为了分担中央仓库流量,提升用户访问速度
- 仓库中保存的内容:Maven工程
- Maven自身所需要的插件
- 第三方框架或工具的jar包
- 我们自己开发的Maven工程
- 仓库的分类:
-
依赖[初步]
- Maven解析依赖信息时会到本地仓库中查找被依赖的jar包。
- 对于我们自己开发的Maven工程,使用mvn install 命令安装后就可以j进入仓库。
- 依赖的常用范围
- compile范围
- 对主程序是否有效: 有效
- 对测试程序是否有效: 有效
- 是否参与打包: 参与
- 是否参与部署:参与
- 典型例子:spring-core
- test范围
- 对主程序是否有效: 无效
- 对测试程序是否有效: 有效
- 是否参与打包:不参与
- 是否参与部署:不参与
- 典型例子:junit
- provided范围(用在Web工程)
- 对主程序是否有效:有效
- 对测试程序是否有效:有效
- 是否参与打包:不参与
- 是否参与部署:不参与
- 典型例子:servlet-api.jar
- compile范围
- Maven解析依赖信息时会到本地仓库中查找被依赖的jar包。
-
生命周期
- 各个构建环节执行的顺序:不能打乱顺序,必须按照既定的正确顺序来执行。
- Maven的核心程序中定义了抽象的生命周期,生命周期中各个阶段的具体任务是由插件来完成的。
- Maven核心程序为了更好的实现自动化构建,按照这一特点执行生命周期中的各个阶段:不论现在要执行生命周期中的哪一个阶段,都是从生命周期最初的位置开始执行的。
- 插件和目标
- 生命周期的各个阶段仅仅定义了要执行的任务是什么
- 各个阶段和插件的目标是对应的
- 相似的目标由特定的插件来完成
- 可以将目标看作“调用插件功能的命令”
| 生命周期阶段 | 插件目标 | 插件 |
|---|---|---|
| compile | compile | maven-compiler-plugin |
| test-compile | testCompile | maven-compiler-plugin |
-
在Eclipse中使用Maven
- Maven插件:Eclipse内置
- Maven插件的设置
- Installations:指定Maven核心程序的位置。不建议使用插件自带的Maven程序,而应该使用我们自己解压的那个。
- user settings:指定conf/settings.xml的指定位置,进而获取本地仓库的位置。
- 基本操作
- 创建Maven版的Java工程
- 创建Maven版的Web工程
- 执行Maven命令
-
依赖[高级]
- 依赖的传递性
- 好处:可以传递的依赖不必在每个模块工程中都重复声明,在“最下面”的工程中依赖一次即可。
- 注意:非compile范围的依赖不能传递。所以在各个工程模块中,如果有需要就得重复声明依赖。
- 依赖的排除
- 依赖排除的配置方式
- 依赖的传递性