maven其实就是一个粘贴依赖,刷新项目的流程
1.为什么使用maven
(1)方便第三方jar包的添加
(2)方便第三方jar包的获取
(3) jar包之间的依赖关系
Maven就可以替我们自动的将当前jar包所依赖的其他所有jar包全部导入进来,无需人工参与
(4)jar包之间的冲突问题
举个例子:
MakeFriend依赖HelloFriend,HelloFriend依赖Hello。而Hello依赖log4j.1.2.17.jar,HelloFriend依赖log4j.1.2.14.jar。如下图所示:
因为Maven中内置了两条依赖原则:最短路径者优先和先声明者优先,上述问题MakeFriend工程会自动使用log4j.1.2.14.jar。
(5)maven可以将项目拆分,适合分工—利用Maven的依赖管理机制
上层模块依赖下层,所以下层模块中定义的API都可以为上层所调用和访问。相当于一种解耦思想
(6)项目的分布式部署
每个模块都需要运行在独立的服务器
ps.一般不会利用maven进行分布式部署
2. 在IDEA中使用Maven
(1)添加依赖:在本地仓库寻找junit.jar包(本地没有会自动下载)
<!--通过dependence添加依赖-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
(2)IDEA中常见操作
clean: 把已经编译的东西清理一遍
validate:校验目前的maven结构是否正常
compile:编译主程序
test:编译测试程序(自动化运营测试:先编译主程序,再编译测试程序)
package:打包成jar包(部署到服务器或者放到仓库)
install:把jar包安装到本地仓库RepMaven(如果)
3. Maven的核心概念
(1)坐标
使用如下三个向量在Maven的仓库中确定唯一的jar
(1)groupId:公司或组织的域名倒序+当前项目名称
(2)artifactId:当前项目的模块名称
(3)version:当前模块的版本
(2) POM的概念
POM:将项目进行拆分,进行模块化管理
(3)依赖管理
3.1依赖范围:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
scope标签决定了当前依赖:1.compile(默认值,同时包括main与test)
2.provided(同时包括main与test)
3. main 或test
ps.compile与provided的区别是
compile部署到Tomcat服务器上运行时要放在WEB-INF的lib目录下
provided部署到Tomcat服务器上运行时不会放在WEB-INF的lib目录下
tomcat就是一款web端应用服务器,provided不需要放到服务器上说明服务器自带
3.2 依赖传递性
例如:A依赖于B,B依赖与C D E,判断A是否可以间接的依赖C D E
依赖的原则:
(1)路径最短者优先
(2)路径相同时声明者优先
取决于在MakeFriend中添加依赖的顺序,以先依赖的为准
3.3 Jar包的排除
通过exclusions:
假设本项目依赖于OurFriends,OurFriends依赖于commons-logging,如果不想让本项目间接依赖commons-logging,则执行如下操作:
<dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>OurFriends</artifactId>
<version>1.0-SNAPSHOT</version>
<!--依赖排除-->
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
相当于排除OurFriends中的commons_logging
3.4 jar包的统一管理
引用一套spring全家桶:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
对引用一套jar包的时候,防止不同版本的冲突,内部的版本号需要控制一下:
将版本号定义为一个变量:
<properties>
<spring.version>4.0.0.RELEASE</spring.version>
</properties>
通过$引用这个变量:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
(4) 仓库
(1)本地仓库:本电脑的Maven服务系统
(2)远程仓库:
a)私服:局域网下Maven工程服务。
b)中央仓库:架设在Internet上,为全世界所有Maven工程服务。
c)中央仓库的镜像:架设在各个大洲,为中央仓库分担流量。减轻中央仓库的压力,同时更快的响应用户请求。
(5)生命周期
- Clean Lifecycle在进行真正的构建之前进行一些清理工作。
- Default Lifecycle构建的核心部分,编译,测试,打包,安装,部署等等。
4. 继承
父工程的作用就是提前做一些配置,方便子工程的使用
1.创建父工程(命名为parent):父工程的打包方式为pom(默认的打包方式为jar包)
<groupId>com.atguigu.maven</groupId>
<artifactId>Parent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
父工程只需要保留pom.xml文件即可
2. 在父工程可以进行统一的jar包的控制:例如将junit控制在4.0版本
<!--依赖管理-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
3. 在子工程中引用父工程:在每一个子工程的pom.xml文件中加入父工程的坐标:
<parent>
<groupId>com.atguigu.maven</groupId>
<artifactId>Parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!--指定从当前pom.xml文件出发寻找父工程的pom.xml文件的相对路径-->
<relativePath>../Parent/pom.xml</relativePath>
</parent>
## ../ 相当于跳到根目录下面,在根目录下寻找parent
ps.注意子工程删除范围和版本号,否则父工程中的指定版本号将不起作用
5.聚合
将工程分为模块后,使用聚合可以批量进行Maven的安装,清理工作
在父工程的pom.xml中进行如下配置:
<!--聚合-->
<modules>
<module>../MakeFriend</module>
<module>../OurFriends</module>
<module>../HelloFriend</module>
<module>../Hello</module>
</modules>
在每一个<module>里面放置需要管理的子工程