一、什么是maven?
maven是一个apache公司下的一个开源的项目,是构建项目的工具,用来管理依赖的。
构建项目:在项目完成编码后,对项目进行编译、运行、打包、部署。
管理依赖:对jar包的统一管理。
二、为什么使用maven?
1、占用内存
众所周知,普通的项目会占很大的内存,里面的最大罪魁祸首就是jar包。
2、项目使用的jar包,都需要复制到项目的lib的文件夹内
3、每次使用jar包都需要去官网去下载,很繁琐
4、会出现jar包冲突和依赖的问题
原因:
- 项目依赖了同一Jar包的多个版本,并且选错了版本。
- 同样的类在不同的Jar包中出现,导致JVM加载了错误的类。
三、什么是依赖?
想弄懂maven的主要作用,就要弄懂什么叫做依赖,不然你不知道maven在管理的是什么。依赖可以理解为:当我们在写一个项目时,需要使用别人提供的API所导入的jar包(比如连接数据库时候,我们需要引用数据库连接池相关jar包和数据库驱动jar包), 说的通俗易懂点,就是管理jar包,只不过在maven中,将其称之为依赖。而maven的好处就是,你需要的jar包可以从通过坐标在poe文件中直接引用,而在普通项目中的jar包需要一个个去官网下载,多麻烦是不。
四、maven如何实现?
4.1仓库
图4.1
如图4.1,本地仓库获取自己需要的jar包,可以直接去中央仓库下载(需要翻墙),也可以从已从中央仓库下载过该jar包的私服上下载。
本地仓库:程序员在自己电脑上建立的文件夹作自己的本地仓库,一般下载的jar包都存放该仓库。
私服:也是一种远程仓库,如阿里云maven仓库(依赖管理仓库)。
中央仓库:是 Maven 社区维护的一个公开的远程仓库,包含了大量常用的库和插件。它是 Maven 生态系统中最重要的仓库之一,也是大多数 Maven 项目默认的远程仓库。
4.2坐标
我们知道了仓库是什么,也知道了本地仓库获取jar包的原理,那么我们在maven项目中如何引入呢?
首先我们在maven项目中找到pom.xml文件。
图4.2
接着,在pom文件中,引入我们所需要的依赖,长得如图4.3所示。
图4.3
注:不同的依赖是写在<dependency></dependency>中,引入的依赖根据其对应的坐标不同,引入的也不同。每个坐标有固定的三部分组成,填写对应的内容能找到对应的依赖。如图4.4所示。
图4.4
五、安装maven
5.1下载maven
官网:Maven – Welcome to Apache Maven
5.2解压
需要把下载的maven项目解压到一个没有中文和空格的文件夹内,如D:\apache-maven-3.5.4。
解压后的目录如图5.1所示。
图5.1
5.3配置环境变量
右击此电脑,看到属性了吧,点进去。
图5.2
进去之后看到高级系统设置了吧,再点进去。win11的位置跟我一样如图5.3所示,win10应该在电脑右半边。
图5.3
进去之后,选择环境变量,如图5.4所示。
图5.4
就跟配置java环境变量一样,选择新建---->添加MAVEN_HOME---->path---->新建---->填写maven的bin目录的位置,如图5.5、图5.6、图5.7。
图5.5
图5.6
图 5.7
5.4测试
按WIN+R,输入cmd,再出现的黑窗口内输入命令mvn -version,如图5.8、图5.9所示。
图5.8
图5.9
六、配置阿里云镜像仓库及本地仓库
上面关于提到仓库的时候,提到过从中央仓库下载对网络有要求,需要翻墙。而阿里云的镜像配置好了之后,我们可以直接从阿里云仓库下载就行。
配置阿里云镜像很容易,打开你所解压的Maven文件夹,找到配置文件并和打开。并在里面添加以下内容。而告诉maven本地仓库你需要新建一个文件夹作你的本地仓库,来存放你所下载的所有jar包。然后如图5.10所示进行配置。
图5.10
需要的代码如下:
<!--阿里云镜像-->
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
<!--告诉maven本地仓库的位置-->
<localRepository>D:\mvn-repository</localRepository>
七、Idea集成maven
打开:File | Settings | Build, Execution, Deployment | Build Tools | Maven,具体步骤如图7.1所示,配置完选择Apply就行。
图7.1
八、如何创建maven项目
在idea选择如下,具体步骤如图7.2,图7.3。
图7.2
图7.3
8.1添加依赖
创建项目后,会有一个pom.xml文件,只是放依赖的配置文件,我们所添加的依赖就是放到这里。
而我们需要依赖的坐标可以从maven仓库找https://mvnrepository.com/。
举个例子,我们找junit的坐标,如图8.1所示。
图8.1
依赖坐标如下:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
然后把依赖坐标放到pom.xml文件里。如图8.2所示。
图8.2
在pom.xml页面右击,选择刷新下载,如图8.3所示。
图8.3
九、生命周期
对于maven有三套相互独立、互不影响的生命周期,并且执行后面的命令前面的命令都会执行(比如在默认生命周期内,你要执行package,那么前面的complie和 test都会执行),它们分别是:
清理生命周期:
clean
将项目根目录下target目录清理掉
默认生命周期:
compile(编译)->test(测试)->package(打包)->install(安装)->deploy(部署)
compile:将项目中的.java文件编译成.class文件
test:对项目进项测试
package:将项目打包到target目录下
install:将打包好的目录安装到本地仓库中
deploy:部署到远程仓库
站点生命周期:
site
用于自动生成和发布包含项目文档、报告和自定义内容的网站,提高项目的透明度和可维护性。
它们在cmd中执行时都是mvn+命令。
但是使用idea时,就比较方便,因为可以直接点击命令对项目进行操作。如图9.1所示。
图 9.1
十、依赖传递及依赖冲突
10.1依赖传递
什么是依赖传递呢?通俗的讲,就是你所引用的依赖,可能还依赖别的依赖,这样的话,当你引入你所需要的依赖时,会把你依赖的依赖也给引进来。如图9.2所示。
图9.2
10.2依赖冲突
为什么会产生 依赖冲突?依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成类包版本冲突。如图9.3所示,你会发现,这两个依赖都有core和beans,但是优先使用5.1.8版本的。
图9.3
但是当你工作了,老板说,你要用5.2.0版本,你怎么办?所以如何解决依赖冲突呢?有四种方法:
1.第一声明者优先原则
也就是谁先定义就先调用谁。说白了就是,你要想优先使用5.2.0版本,你就把5.2.0版本放在前面。如下图所示:
2.路径近者优先
也就是,你想用5.2.0的什么依赖,你就直接用 ,就相当你点道姓用谁的意思。比如我想用5.2.0的core,我就直接把对应的坐标引入。如下图:
3.依赖排除
通俗的说,在依赖冲突的情况下,因为5.1.8版本的依赖在前,所以会优先引用5.8.1版本的依赖,但你可以在依赖里面排除你不想用的依赖。就比如,5.1.8的beans你不想用,你直接排除,正好你引入的5.2.0版本的有,那么你只能用5.2.0那么版本。如下图:
4.版本锁定
这个就相当你点名道姓 说用什么版本,比如,我规定我的beans只用5.2.0版本的,别的不带用的,那么你用的只能用我规定的这个版本,这也是公司常用的一种方法。如下图:
十一、依赖范围
依赖的jar包在默认情况下可以在任何范围内使用,可以通过scope标签来控制其作用范围。作用范围如下:
主程序(main方法)
测试程序(junit)
打包(package指令范围之内)
scope | 主代码 | 测试代码 | 打包 |
compile | √ | √ | √ |
test | √ | ||
provided | √ | √ | |
runtime | √ | √ |
举个例子:
我在依赖最后一行,加上作用域为test。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.8.RELEASE</version>
<scope>test</scope>
</dependency>
我将如下代码放到main函数内,就会报错。
public class Demo {
public static void main(String[] args) {
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("");//报错
}
}
但如果在junit内测试,就会正常运行。
public class DemoTest {
@Test
public void test2(){
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("");//不报错
}
}
总结
以上就是maven相关内容。