Maven学习笔记
Maven
1.What
-
Maven是一款服务于Java平台的自动化构建工具。
Make--->Ant--->Maven--->Gradle
-
什么是程序的构建:
- 以Java源文件、配置文件、jsp、html、图片等项目开发需要的”原材料“,去”生产“一个可以运行的项目的过程
-
构建过程的各个细节:
- 清理:将以前得到的旧的class字节码文件删除,为下一次编译做准备
- 编译:将Java源程序编程成class字节码文件
- 测试:自动的测试,自动调用junit程序
- 报告:测试程序执行的结果
- 打包:动态Web工程打war包,Java工程打Jar包
- 安装:Maven特定的概念----将打包得到的文件复制到
仓库
中的指定位置 - 部署:将动态Web工程生成的war包复制到Servlet容器的制定目录下,使其可以运行
2.安装
要使用maven不一定要安装JDK,如果用到了比如java.exe就要安装jdk环境
- 安装jdk(不是必须的)
- 下载maven
- 配置环境变量 M2_HOME:meven不带bin的路径和 path:maven/bin的路径
- 测试:cmd mvn -v
3.Maven的核心概念
-
约定的目录结构:
①创建约定的目录结构
[1]根目录:工程名
[2]src目录:源码
[3]pom.xml文件:Maven工程的核心配置文件
[4]main目录:存放主程序
[5]test目录:存放测试程序
[6]Java目录:存放java源文件
[7]resource目录:存放框架或其他程序的配置文件
②为什么要遵守约定的目录结构呢?
-
Maven要负责我们这个项目的自动化构建,以编译为例,Maven想要自动进行编译,那么它必须知道Java源文件放在哪里
-
如果我们自定义的东西想让框架或工具知道,有两种办法
-
以配置的方式明确告诉框架
classpath:spring-context.xml -
遵守框架内部已经存在的约定
log4j:properies
log4j.xml
-
-
约定>配置>编码
-
-
POM
-
坐标
-
依赖
-
仓库
-
生命周期/插件/坐标
-
继承
-
聚合
常用Maven命令
①注意:执行与构建过程相关的命令,必须进入pom.xml所在的目录。 与构建过程相关:编译,测试,打包,部署......
②常用的命令
- mvn clean:清理
- mvn compile:编译
- mvn test-compile:编译测试程序
- mvn-test:执行测试
- mvn package:打包
- mvn install:安装
- mvn site:生成站点
关于联网的问题
-
Maven的核心程序中仅仅定义了抽象的生命周期,但是具体的工作必须由特定的插件来完成,而插件本身并不在Maven的核心程序中。
-
当我们执行的Maven命令需要用到某些插件时,Maven核心程序会首先到本地仓库中查找。
-
本地仓库的默认位置:【系统中当前用户的家目录】.m2\repository
-
Maven程序如果在本地仓库中找不到需要的插件,那么他会自动连接外网,到中央仓库去下载
-
如果此时无法连接外网,则构建失败。
-
修改默认本地仓库的位置,可以让Maven核心程序到我们事先准备好的目录下查找插件
[1]找到Maven解压目录\conf\settings.xml
[2]在settings.xml中找到
标签 [3]将
/path/to/local/repo 从注释中取出 [4]将标签体内容修改为已经准备好的Maven仓库目录
4.target目录(常用命令执行结果):
当你执行了mvn compile时候,就会生成一个target文件夹,里边放的是编译好以后的程序,也就是.class文件,当执行了mvn clean命令后,target文件夹就会删除,执行mvn package命令时就会在target文件夹下生成一个打好的jar包,主程序打包会进入jar包,而测试的不会进来
5.POM
-
含义:Project Object Model项目对象模型
DOM:Document Object Model 文档对象模型
-
pom.xml对于Maven工程是核心配置文件,与构建过程相关的一切配置都在这个文件中进行配置。重要程度相当于web.xml对于动态web工程
6.坐标
Maven的坐标
①使用下面三个向量在仓库中唯一定义一个Maven工程
[1]groupid:公司或组织域名倒叙+项目名
[2]artifactied:模块的名称
[3]version:版本
gav说的是坐标
②Maven工程的坐标与仓库中路径的对应关系
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.2.RELEASE</version>
</dependency>
org/springframework/spring-core/4.0.2.RELEASE/spring-core-4.0.2.RELEASE.jar
7.仓库
①仓库的分类
[1]本地仓库:当前电脑上部署的仓库目录,为当前电脑上所有Maven工程服务
[2]远程仓库
(1)局域网(私服):搭建在局域网环境中,为局域网范围内的所有Maven工程服务
(2)中央仓库:架设在Internet上,为全世界所有的Maven工程服务
(3)中央仓库镜像:为了分担中央仓库的流量,提升用户访问的速度
②仓库中保存的内容:Maven工程
[1]Maven自身所需要的插件
[2]第三方框架或工具的jar包 第一方式jdk 第二方是我 第三方是别的公司
[3]我们自己开发的Maven工程
8.依赖[初步]
①Maven解析依赖信息时会到本地仓库中查找被依赖的jar包
对于我们自己开发的Maven工程,使用install命令安装后就可以进入仓库。
②依赖的范围
[1]compile范围依赖
- 对主程序是否有效:有效
- 对测试程序是否有效:有效
- 是否参与打包:参与
- 是否参与部署:参与
- 典型例子:spring-core
[2]test范围依赖
- 对主程序是否有效:无效
- 对测试程序是否有效:有效
- 是否参与打包:不参与
- 是否参与部署:不参与
- 典型例子:junit
[3]provided范围依赖
- 对主程序是否有效:有效
- 对测试程序是否有效:有效
- 是否参与打包:不参与
- 是否参与部署:不参与
- 典型例子:servlet-api.jar
9.生命周期
①各个构建环节执行的顺序:不能打乱顺序,必须按照既定的正确顺序来执行。
②Maven的核心程序定义了抽象的生命周期,生命周期中各个阶段的具体任务是由插件来完成的。
③Maven核心程序为了更好的实现自动化构建,按照这一特点执行生命周期中的各个阶段:不论现在要执行
生命周期中的哪一个阶段,都是从这个生命周期最初的位置开始执行。
mvn compile |
---|
maven-resources-plugin:2.6:resources maven-compiler-plugin:2.5.1:compile |
④插件和目标
[1]生命周期的各个阶段仅仅定义了定义了要执行的任务是什么。
[2]各个阶段和插件的目标是对应的。
[3]相似的目标由特定的插件来完成。
生命周期阶段 | 插件目标 | 插件 |
---|---|---|
compile | compile | maven-compiler-plugin |
test-compile | testCompile | maven-compiler-plugin |
[4]可以将目标看做 “调用插件功能的命令”
10.在Eclipse中使用Maven
①Maven插件:Eclipse内置
②Maven插件的设置:
[1]installations:指定Maven核心程序的位置。不建议使用插件自带的Maven程序,而应该使用我们自己解压的那个。
[2]user settings:指定conf/settings.xml的位置,进而获取本地仓库的位置。
③基本操作
[1]创建Maven版的Java工程
[2]创建Maven版的Web工程
[3]执行Maven命令
11.依赖[高级]
①依赖的传递性
[1]好处:可以传递的依赖不必在每个模块工程中都声明,在“最下面”的工程中依赖一次即可。
[2]注意:非compile范围的依赖不能传递。所以在各个工程模块中,如果有需要就得重复声明依赖。
②依赖的排出
[1]需要设置依赖排出的场合
[2]依赖排除的设置方式(如果从中间掐了,下边传递的也没了)
③依赖的原则
[1]作用:解决模块工程之间的jar包冲突问题
[2]情景设定1:验证路径最短者优先优先原则
[3]情景设定2:验证路径相同时先声明者优先
先声明时dependency标签声明顺序
④统一管理依赖的版本
[1]情景举例
这里对Spring各个jar包的依赖版本都是4.0.0
如果需要统一升级为4.1.1,怎么办?手动逐一修改不可靠。
[2]建议配置方式
i.使用properties标签内使用自定义标签统一声明版本号
<properties>
<!-- spring版本号 -->
<spring.version>4.0.2.RELEASE</spring.version>
<!-- mybatis版本号 -->
<mybatis.version>3.2.8</mybatis.version>
<!-- log4j日志文件管理包版本 -->
<slf4j.version>1.7.7</slf4j.version>
<log4j.version>1.2.17</log4j.version>
<maven.test.skip>true</maven.test.skip>
<maven.test.failure.ignore>true</maven.test.failure.ignore>
</properties>
ii.在需要版本的位置,使用${自定义标签名}引用声明的版本号
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
[3]其实properties标签配合自定义标签声明数据的配置并不是只能用于声明依赖的版本号。
12.继承
①现状
Hello依赖的junit:4.0
HelloFriend依赖的junit:4.0
MakeFriends依赖的junit:4.9
由于test范围的依赖不能传递,所以必然会分散在各个模块工程中,很容易造成版本不一致
②需求:统一管理各个模块工程中对junit依赖的版本
③解决思路:将junit依赖版本统一提到“父”工程中,在子工程中声明依赖时不指定版本,以父工程统一设定为准。
④操作步骤
[1]创建一个Maven工程作为父工程。注意:打包的方式pom。
[2]在子工程中声明对父工程的引用
[3]将子工程的坐标中与父工程坐标中重复的内容删除
[4]在父工程中统一junit依赖(加入依赖管理标签)
[5]在子工程中删除junit依赖的版本号部分
⑤注意:配置继承后,执行安装命令时要先安装父工程。
13.聚合
①作用:一键安装各个模块工程
②操作步骤:在一个“总的聚合工程”中配置各个参与聚合的模块
③使用方式:在聚合工程的pom.xml上点右键------>run as --->maven install
14.父工程和直接引入工程依赖的区别
父工程中定义所有的依赖和依赖版本,子工程直接写groupId和artifactId就行不用写version,但是子工程得引用才能有依赖
而直接引用别的工程,可以把别的工程得依赖和类也引进来。