Maven学习总结

1.Maven简介

1.1为什么要使用Maven?

传统方式构建的web项目中使用jar包,需要重复的复制到项目的lib中。

maven方法构建的web项目中没有jar包

1.2.Maven是什么?

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

maven有两大核心功能:

  • 管理依赖:对jar包统一管理
  • 项目构建:项目在编码完成后,对项目进行编译、测试、打包、部署的一系列操作

1.3.Maven的好处如何实现?

1.3.1.仓库

在这里插入图片描述

  • 本地仓库 :用来存储从远程仓库或中央仓库下载的插件和 jar 包
  • 私服:如果本地需要插件或者 jar 包,本地仓库没有则去私服下载
  • 中央仓库 :中央仓库服务于整个互联网,它是由 Maven 团队自己维护,里面存储了非常全的 jar 包,它包 含了世界上大部分流行的开源项目构件。

1.3.2.坐标

什么是坐标?
作用:用于定位jar包在仓库中的位置

在这里插入图片描述

2.Maven安装

2.1.下载

官网:http://maven.apache.org/

2.2.解压

Maven 下载后将 Maven 解压到一个没有中文没有空格的路径下, 解压后目录结构如下:

bin:脚本命令

boot:引导程序,如类加载器等

conf:配置文件,如 setting.xml 文件

lib:maven 本身运行所需的一些 jar 包

2.3.配置环境变量

安装前提:maven是由java语言开发,它的运行依赖于jdk

安装步骤:

  1. 配置MAVEN_HOME

  2. 将MAVEN_HOME环境变量配置到path中

  3. 测试

    找开 cmd 命令,输入 mvn –version命令,如下图

    在这里插入图片描述

2.4.配置阿里云镜像仓库

直接从maven中央仓库下载速度非常慢,我们可以在settings配置文件中,配置阿里云镜像仓库:

<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>central</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

2.5.配置本地仓库路径

打开 settings.xml文件,配置如下:

  <!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
  -->
<localRepository>D:\mvn_repository</localRepository>

3.Idea集成Maven

3.1.配置maven

打开:File | Settings | Build, Execution, Deployment | Build Tools | Maven

在这里插入图片描述

3.2.设置idea自动导入依赖

第一种方式:首次在pom文件中添加依赖时,IDEA右下角会弹框提示是否开启自动导入,点击开启即可。

第二种方式:File | Settings | Build, Execution, Deployment | Build Tools | Maven | Importing

4.创建maven工程

4.1.创建工程

4.2.1.创建工程

  1. 选择maven

在这里插入图片描述

  1. 设置工程名
    在这里插入图片描述

  2. 设置工程位置

    在这里插入图片描述

4.2.maven工程目录结构

  • 目录结构如下图:

在这里插入图片描述

  • 说明:
    |—src:源码
    |— |—main:存放主程序
    |— |— |—java:java源码文件
    |— |— |—resource:存放框架的配置文件
    |— |— test:存放测试程序
    |—pom.xml:maven的核心配置文件

4.3.添加依赖

  1. 查找坐标

    在浏览器打开https://mvnrepository.com/,查找junit的坐标

  2. 在pom文件添加依赖

        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
        </dependencies>
    
  3. 添加测试类

    import org.junit.Test;
    
    public class DemoTest {
        @Test
        public void test(){
            System.out.println("hello,maven!");
        }
    }
    

5.生命周期

5.1.常用命令

在pom.xml的同级目录下面,执行cmd命令

5.1.1.clean

  • 命令:mvn clean
  • 说明:将项目根目录下target目录清理掉

5.1.2.compile

  • 命令:mvn compile
  • 说明:将项目中的.java文件编译为.class文件

5.1.3.test

  • 命令:mvn test
  • 说明:将项目根目录下target目录清理掉

5.1.4.package

  • 命令:mvn package
  • 说明:将项目打包到target目录下

5.1.5.install

  • 命令:mvn install
  • 说明:打包到本地仓库

5.1.6.deploy

  • 命令:mvn deploy
  • 说明:部署到远程仓库

5.2.生命周期

在maven中存在“三套”生命周期,每一套生命周期相互独立、互不影响,并且在一套生命周期内,执行后面的命令前面的命令都会自动执行:

  • 清理生命周期:

    ​ clean

  • 默认生命周期:

    ​ compile—test—package—install—deploy

  • 站点生命周期:

    ​ site

6.依赖管理

6.1.依赖传递

直接依赖:在当前项目中,通过依赖配置建立的依赖关系
间接依赖:被依赖的资源,如果还依赖其他资源,那么当前项目间接依赖其他资源

6.2.依赖冲突

依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成类包版本冲突。

如下所示:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.1.8.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>

通过查看依赖,我们发现spring-aop和spring-context都依赖了一个叫spring-core的依赖。此时spring-core的版本有两个,这样就产生了依赖冲突

6.2.1.第一声明者优先原则

谁先定义的就用谁的传递依赖:即调换spring-aop和spring-context位置

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.1.8.RELEASE</version>
</dependency>

6.2.2.路径近者优先原则

直接依赖级别高于传递依赖:即直接引入spring-beans

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.1.8.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>

6.2.3.排除依赖

排除依赖:在不影响项目运行的情况下把冲突的依赖排除掉

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.1.8.RELEASE</version>
    <exclusions>
        <exclusion>
            <artifactId>spring-core</artifactId>
            <groupId>org.springframework</groupId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>

6.2.4.版本锁定

版本锁定:使用dependencyManagement 进行版本锁定

    <properties>
        <spring-core.version>5.2.0.RELEASE</spring-core.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>${spring-core.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.2.0.RELEASE</version>
        </dependency>
    </dependencies>

6.3.依赖范围

6.3.1.什么是依赖范围?

依赖的jar包在默认情况下可以在任何范围内使用,可以通过scope标签来控制其作用范围。作用范围如下:

​ 主程序(main方法)

​ 测试程序(junit)

​ 打包(package指令范围之内)

在这里插入图片描述

6.3.2.测试

  1. 把spring-context的作用域换成test

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.1.8.RELEASE</version>
        <scope>test</scope>
    </dependency>
    
  2. 在main方法中测试

    public class Demo {
        public static void main(String[] args) {
            ApplicationContext applicationContext = 
            					new ClassPathXmlApplicationContext("");//报错
        }
    }
    
  3. 在junit中测试

public class DemoTest {
    @Test
    public void test2(){
        ApplicationContext applicationContext = 
        					new ClassPathXmlApplicationContext("");//不报错
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值