doc/笔记/Maven的基本使用-maven-jiao-cheng.md

9.1 KiB
Raw Blame History

title date updated url categories tags
Maven的基本使用 2023-04-22 16:18:15.469 2023-05-13 10:35:29.575 /archives/maven-jiao-cheng
Java

1.安装Maven

1.1下载

Maven官网下载地址https://maven.apache.org/download.cgi

1.2安装

解压至指定目录,例如我的路径就是D:\apache-maven-3.9.1 ,路径里不要有中文或特殊符号

1.3修改本地仓库位置

Maven配置文件所在路径为D:\apache-maven-3.9.1\conf\settings.xml

maven-01

记得要把 localRepository 标签从注释中拿出来

1.4配置阿里云提供的镜像仓库

将原有的例子配置注释掉

加入阿里云镜像仓库

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

maven-02

1.5配置基础 JDK 版本

Java 工程使用的默认 JDK 版本是 1.5profile 标签整个复制到 settings.xml 文件的 profiles 标签内

<profile>
    <id>jdk-1.8</id>
    <activation>
        <activeByDefault>true</activeByDefault>
        <jdk>1.8</jdk>
    </activation>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
       <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
    </properties>
</profile>

1.6配置Maven环境变量

MAVEN_HOME

D:\apache-maven-3.9.1

PATH

%MAVEN_HOME%\bin

配置环境变量的规律:

XXX_HOME 通常指向的是 bin 目录的上一级

PATH 指向的是 bin 目录

2. Maven 的使用

3.1 核心概念:坐标

数学中的坐标使用 x、y、z 三个『向量』作为空间的坐标系,可以在『空间』中唯一的定位到一个『』。

Maven中的坐标使用三个『向量』在『Maven的仓库』中唯一的定位到一个『jar』包。

  • groupId:公司或组织的 id即公司或组织域名的倒序通常也会加上项目名称

例如groupIdcom.tofacebook.maven

  • artifactId:一个项目或者是项目中的一个模块的 id即模块的名称将来作为 Maven 工程的工程名就是module的名称

例如artifactIdauth

  • version:版本号

例如version1.0.0

提示:坐标和仓库中 jar 包的存储路径之间的对应关系,如下

<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>

复制

上面坐标对应的 jar 包在 Maven 本地仓库中的位置:

Maven本地仓库根目录\javax\servlet\servlet-api\2.5\servlet-api-2.5.jar

复制

3.2 pom.xml

POMProject Object Model项目对象模型。和 POM 类似的是DOMDocument Object Model文档对象模型。它们都是模型化思想的具体体现。

POM 表示将工程抽象为一个模型,再用程序中的对象来描述这个模型。这样我们就可以用程序来管理项目了。我们在开发过程中,最基本的做法就是将现实生活中的事物抽象为模型,然后封装模型相关的数据作为一个对象,这样就可以在程序中计算与现实事物相关的数据。

POM 理念集中体现在 Maven 工程根目录下 pom.xml 这个配置文件中。所以这个 pom.xml 配置文件就是 Maven 工程的核心配置文件。其实学习 Maven 就是学这个文件怎么配置,各个配置有什么用。

<!-- 当前Maven工程的坐标 -->
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<!-- 当前Maven工程的打包方式可选值有下面三种 -->
<!-- jar表示这个工程是一个Java工程  -->
<!-- war表示这个工程是一个Web工程 -->
<!-- pom表示这个工程是管理其他工程的工程 -->
<packaging>jar</packaging>
<properties>
    <!-- 工程构建过程中读取源码时使用的字符集 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 当前工程所依赖的jar包 -->
<dependencies>
    <!-- 使用dependency配置一个具体的依赖 -->
    <dependency>
        <!-- 在dependency标签内使用具体的坐标依赖我们需要的一个jar包 -->
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <!-- scope标签配置依赖的范围 -->
        <scope>test</scope>
    </dependency>
</dependencies>

复制

3.3 依赖

上面说到我们使用 Maven 最主要的就是使用它的依赖管理功能引入依赖存在一个范围maven的依赖范围包括 compileprovideruntimetestsystem

  • compile:表示编译范围,指 A 在编译时依赖 B该范围为默认依赖范围。编译范围的依赖会用在编译,测试,运行,由于运行时需要,所以编译范围的依赖会被打包。
  • providedprovied 依赖只有当 jdk 或者一个容器已提供该依赖之后才使用。provide 依赖在编译和测试时需要在运行时不需要。例如servlet api被Tomcat容器提供了。
  • runtimeruntime 依赖在运行和测试系统时需要但在编译时不需要。例如jdbc 的驱动包。由于运行时需要,所以 runtime 范围的依赖会被打包。
  • testtest 范围依赖在编译和运行时都不需要只在测试编译和测试运行时需要。例如Junit。由于运行时不需要所以 test 范围依赖不会被打包。
  • systemsystem 范围依赖与 provide 类似,但是必须显示的提供一个对于本地系统中 jar 文件的路径。一般不推荐使用。
依赖范围 编译 测试 运行时 是否会被打入jar包
compile
provided × ×
runtime ×
test × × ×
system ×

而在实际开发中,我们常用的就是 compiletestprovided

3.4 依赖的传递

A 依赖 BB 依赖 C那么在 A 没有配置对 C 的依赖的情况下A 里面能不能直接使用 C

再以上的前提下C 是否能够传递到 A取决于 B 依赖 C 时使用的依赖范围。

  • B 依赖 C 时使用 compile 范围:可以传递
  • B 依赖 C 时使用 test 或 provided 范围:不能传递,所以需要这样的 jar 包时,就必须在需要的地方明确配置依赖才可以。

3.5 依赖的排除

当 A 依赖 BB 依赖 C 而且 C 可以传递到 A 的时候A 不想要 C需要在 A 里面把 C 排除掉。而往往这种情况都是为了避免 jar 包之间的冲突。

img

所以配置依赖的排除其实就是阻止某些 jar 包的传递。因为这样的 jar 包传递过来会和其他 jar 包冲突。

一般通过使用excludes标签配置依赖的排除:

<dependency>
    <groupId>net.javatv.maven</groupId>
    <artifactId>auth</artifactId>
    <version>1.0.0</version>
    <scope>compile</scope>
    
    <!-- 使用excludes标签配置依赖的排除    -->
    <exclusions>
        <!-- 在exclude标签中配置一个具体的排除 -->
        <exclusion>
            <!-- 指定要排除的依赖的坐标不需要写version -->
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

复制

3.6 继承

3.6.1 概念

Maven工程之间A 工程继承 B 工程

  • B 工程:父工程
  • A 工程:子工程

本质上是 A 工程的 pom.xml 中的配置继承了 B 工程中 pom.xml 的配置。

3.6.2 作用

在父工程中统一管理项目中的依赖信息,具体来说是管理依赖信息的版本。

它的背景是:

  • 对一个比较大型的项目进行了模块拆分。
  • 一个 project 下面,创建了很多个 module。
  • 每一个 module 都需要配置自己的依赖信息。

它背后的需求是:

  • 在每一个 module 中各自维护各自的依赖信息很容易发生出入,不易统一管理。
  • 使用同一个框架内的不同 jar 包,它们应该是同一个版本,所以整个项目中使用的框架版本需要统一。
  • 使用框架时所需要的 jar 包组合(或者说依赖信息组合)需要经过长期摸索和反复调试,最终确定一个可用组合。这个耗费很大精力总结出来的方案不应该在新的项目中重新摸索。

通过在父工程中为整个项目维护依赖信息的组合既保证了整个项目使用规范、准确的 jar 包;又能够将以往的经验沉淀下来,节约时间和精力。

参考:

https://blog.ideaopen.cn