maven基础

maven命令

命令 含义
mvn clean 清理已编译好的target目录下的文件(包含target本身)
mvn compile 编译源代码
mvn test 执行项目中的单元测试用例
mvn package 根据项目<packing>标签类型打包成指定文件,默认jar
mvn install 把打包好的文件安装在本地Repository仓库中
mvn deploy 把打包好的文件发布至maven私服

maven依赖管理

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.0</version>
  </dependency>
</dependencies>

<dependency>:标识引入组件
<groupId>:组件组织唯一标识,对应的一般是java的包结构
<artifactId>:组件唯一标识
<version>:组件版本

加载流程

maven会先去本地仓库查找是否存在如不存在则去上级查找(一般上级为企业私服),如私服不存在则再去配置的公网服务器(一般为了加载快速会在maven配置文件中指定不同的国内镜像源如图中所示阿里)中查找,如也不存在则直接去maven中央仓库查找
maven依赖管理.jpg

项目依赖

项目依赖是指maven通过依赖传播、依赖优先原则、可选依赖、排除依赖、依赖范围等特性来管理项目项目

依赖传播特性

在项目开发时,长长会用到第三方组件,而第三方组件在也会依赖其他组件,遇到这种第三方组件,maven会把该项目所需的所有组件都加载到本项目中

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus</artifactId>
    <version>3.5.2</version>
</dependency>

image.png
如图所示,项目引用了mybatis-plus为直接依赖;而对mybatis依赖是通过mybatis-plus一来传递加载进来的为间接依赖

依赖优先原则

基于依赖传播特性,会导致整个项目的依赖网络错综复杂,会照成相同组件却出现不同版本的问题;maven遇到该问题时,会根据依赖优先原则选择某个版本。

第一原则:最短路径优先

<dependencies>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus</artifactId>
        <version>3.5.2</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.11</version>
    </dependency>
</dependencies>

如项目依赖A;但A组件和项目本身均依赖X组件;
其中mybatis-plus组件依赖mybatis组件路径为yulun-client-->mybatis-plus-->mybatis-plus-core-->mybatis(3.5.10)
yulun-client项目本身依赖X路径为yulun-client-->mybatis(3.5.11)
在路径上看,项目本身依赖路径最短,优先使用mybatis(3.5.11);
image.png

第二原则:第一声明优先

如项目依赖X和Y组件;但X和Y组件均依赖Z组件,但X(Z=1.0)和Y(Z=2.0)的组件依赖路径相同,但版本不同,则根据pom声明顺序进行加载,如X声明在Y之前则加载Z(2.0)版本。

第三原则:覆盖优先

子类pom内声明优先于父类pom,子类和父类都引入了mybatis-plus组件,子类为引入的为3.5.0版本,父类为3.5.2版本,在该情况下,子类覆盖父类,默认加载3.5.0版本

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus</artifactId>
    <version>3.5.0</version>
</dependency>

image.png
image.png

可选依赖

可通过<optional>标签,表示该依赖非必须,在其他组件引用该组件时,被<optional>标签标识为true的组件不会被依赖。

<!-- 直接添加commons-logging -->
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
    <optional>true</optional>
</dependency>

排除依赖

排除指定依赖,如A组件依赖了B组件,但无需使用,故此可直接声明在引用A组见时排除B组件

<!-- 直接添加commons-logging -->
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
    <exclusions>
        <exclusion>
           <groupId>org.springframework</groupId>
           <artifactId>spring-web</artifactId>
        </exclusion>
    </exclusions>
</dependency>

依赖范围

通过标签来标识依赖的范围

compile(默认) 编译范围,编译和打包均会依赖
provided 提供范围,编译时依赖,但不会打包到项目中
runtime 运行是范围,打包时依赖,编译不会
test 测试范围,编译运行测试用例时加载
system 编译时依赖,不会打包到项目中

项目聚合

聚合

可将多个模块整合到一起,统一构建,面掉一个个构建;聚合需要一个父工程支撑,在父工程pom中添加<modules>进行整合

<modules>
    <module>yulun-client</module>
    <module>yulun-server</module>
</modules>

继承

子项目可直接继承父项目配置的属性、依赖、插件等配置,避免个个项目重复配置,同时继承的属性、依赖、插件等,子工程均可重写,重写后以子工程为准,参考依赖优先覆盖原则

依赖管理

因为继承特性,多个子工程可间接依赖父工程的依赖,针对于多个子工程依赖同一个组件时,可能会导致每个子工程以来的组件版本不同;这种情况下可通过父工程使用<dependencyManagement>标签进行统一定义版本,而后子工程只需引入组件,无需指定版本。

<!-- 父工程中声明 junit 4.12 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
</dependencyManagement>
<!-- 子工程中引入 -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
</dependency>

项目属性

在pom中可通过标签进行配载自定义属性,如图:

<!-- 定义方式 -->
<properties>
    <name>yulun</name>
</properties>

<!-- 引入方式 -->
${name}

maven默认属性

命令 含义
${basedir} 项目根路径
${version} 项目版本
${project.besedir} 同项目根据路径
${project.verison} 同项目版本
${project.bulid.directory} 构建目录,默认值为target
${project.build.sourceEncoding} 主源码编译格式
${project.build.sourceDirectory} 主源码路径
${project.build.finalName} 输出文件名称
${project.build.outputDirectory} 构建项目输出路径,默认值为target/classes
posted @ 2023-02-21 20:03  雨伦  阅读(35)  评论(0)    收藏  举报