五分钟了解Maven

一、什么是maven?

maven是一个apache公司下的一个开源的项目,是构建项目的工具,用来管理依赖的

构建项目:在项目完成编码后,对项目进行编译、运行、打包、部署。

管理依赖:对jar包的统一管理。

二、为什么使用maven?

1、占用内存

      众所周知,普通的项目会占很大的内存,里面的最大罪魁祸首就是jar包。

2、项目使用的jar包,都需要复制到项目的lib的文件夹内

3、每次使用jar包都需要去官网去下载,很繁琐

4、会出现jar包冲突和依赖的问题

原因:

  1. 项目依赖了同一Jar包的多个版本,并且选错了版本。
  2. 同样的类在不同的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相关内容。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值