一问搞懂maven基础以及高级用法

3,787 阅读2分钟

一、为什么要学习maven?

maven是一款项目包管理以及项目构建工具,已经广泛流行于各大中大型项目开发构建。解决了过去传统web项目依赖包管理混乱问题。

二、maven的基本概念

1.maven的本地仓库与中心仓库

maven拉取jar包是通过中央仓库拉取到本地仓库,优先会去本地仓库查询引入的jar包是否存在

2.坐标

maven的pom文件中的groupId(通常是公司的域名或者包名) artifictId(项目的唯一标识符) version(依赖的版本号)三个标签可以唯一定位jar包,maven就是用这些标签唯一定位依赖位置

3、maven项目的基本结构

image.png

tips:pom文件统一管理了项目的依赖版本,maven官方称之为项目对象模型(Project Object Model)

二、依赖引用

1.普通单个项目引用

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.example</groupId>
  <artifactId>mavenTest</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>Archetype - mavenTest</name>
  <url>http://maven.apache.org</url>

  <properties>
<!--  声明具体的依赖版本-->
    <spring-boot.version>2.6.13</spring-boot.version>

  </properties>
<!--  统一项目集中管理配置-->
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  </dependencies>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>${spring-boot.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>

2.父子工程依赖引用(日常工作最常用)

idea新建一个maven项目,在下面新建两个module为子项目,外层为父项目,实际工作中,最常用的就是这种模式,会包含子项目的相互依赖,子项目继承父项目的依赖,子项目覆盖或者忽略父项目的依赖

image.png 此时默认两个模块都继承了父工程的依赖

image.png 如何让模块引入另一个模块的依赖?

image.png 项目A的pom文件引入mysql的驱动依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.example</groupId>
        <artifactId>mavenTest</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <groupId>org.example</groupId>
    <artifactId>projectA</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>Archetype - projectA</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.23</version>
        </dependency>
    </dependencies>
</project>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.example</groupId>
        <artifactId>mavenTest</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <artifactId>projectB</artifactId>
    <name>Archetype - projectB</name>
    <url>http://maven.apache.org</url>
<!--    项目B加入 项目A的坐标 默认也会引入项目A引入的依赖-->
    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>projectA</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

tips:在使用idea开发的时候,可能会出现项目众多,依赖众多,不好找到依赖来源的情况,可以使用idea查看maven的依赖链路

image.png

image.png 快捷键ctrl+F可以快速查询对应的依赖

日常开发中可能引入其他项目的时候,不想使用他的依赖,可以添加exclusions标签

image.png 或者在当前项目直接引入新的依赖版本进行覆盖,maven获取依赖默认是优先当前项目的pom文件的,如果当前pom文件有依赖会默认omit其他项目的依赖

image.png