【Java架构-包管理工具】-Maven进阶(二)

本文摘要

Maven作为Java后端使用频率非常高的一款依赖管理工具,在此咱们由浅入深,分三篇文章(Maven基础、Maven进阶、私服搭建)来深入学习Maven,此篇为开篇主要介绍Maven进阶知识,包含坐标、依赖、仓库、生命周期、插件、继承


文章目录

  • 本文摘要
  • [1. 坐标](#1. 坐标)
    • [1.1 坐标含义](#1.1 坐标含义)
  • [2. 依赖](#2. 依赖)
    • [2.1 依赖范围](#2.1 依赖范围)
      • [1. classpath](#1. classpath)
      • [2. scope](#2. scope)
    • [2.2 依赖传递](#2.2 依赖传递)
    • [2.3 依赖冲突](#2.3 依赖冲突)
    • [2.4 依赖阻断](#2.4 依赖阻断)
  • [3. 仓库](#3. 仓库)
    • [3.1 仓库配置](#3.1 仓库配置)
      • [3.1.1 本地仓库](#3.1.1 本地仓库)
      • [3.1.2 中央仓库-阿里云仓库配置](#3.1.2 中央仓库-阿里云仓库配置)
  • [4. 生命周期](#4. 生命周期)
  • [5. 插件](#5. 插件)
  • [6. 继承](#6. 继承)
    • [6.2 可继承的pom元素](#6.2 可继承的pom元素)
    • [6.3 dependencyManagement](#6.3 dependencyManagement)
    • [6.4 porperties](#6.4 porperties)

1. 坐标

坐标是构件的唯一标识,Maven 坐标的元素包括groupId、artifactId、version、packaging、classifier。上述5个元素中,groupId、artifactId、version 是必须定义的,packaging 是可选的 ( 默认为 jar )

1.1 坐标含义

xml 复制代码
<groupId>org.example</groupId>
<artifactId>study-maven</artifactId>
<version>1.0-SNAPSHOT</version>
坐标元素 含义 举例
groupId 组织标识,一般为:公司网址反写+项目名 org.example
artifactId 项目名称,一般为:项目名-模块名 study-maven
version 版本号0.0.1-SNAPSHOPT 第一个0表示大版本号 第二个0表示分支版本号 第三个0表示小版本号 SNAPSHOT:快照 ALPHA:内测版本 BETA:公测版本 RELEASE:稳定版本 GA:正式版本 study-maven
packaging 打包方式 pom jar maven-plugin ejb war ...
clissifier 用来帮助定义构件输出的一些附属构件,通常不用

2. 依赖

2.1 依赖范围

1. classpath

Maven项目在开发工程中有三套classpath

  • 主代码:main下面的都是主代码在编译的时候的依赖
  • 测试代码:test下是测试代码编译的时候的依赖
  • 运行时:main代码在运行的时候对包的依赖
    依赖范围的使用,通过在引用第三方依赖时的标签进行设置,例如:

2. scope

Maven中共 6 种 scope,包括:compile、provided、runtime、test、system、import,但实际生产中用得最多的也就标红的四种

  • compile:在编译、测试、打包时都会将jar包打进项目中
  • test:只在运行测试classpath里边的代码才会生效
  • provided:只能测试、main的classpath代码生效,runtime的classpath无效
  • runtime:只有在runtime的classpath环境下生效

2.2 依赖传递

依赖传递指:A项目依赖了B项目,B项目依赖了C项目,则A项目中也会引入C项目,其中A依赖B被称为第一传递依赖,B依赖C被称为第二传递依赖

依赖传递原则

2.3 依赖冲突

依赖冲突指:A项目依赖B项目,B项目依赖C项目的1.0版本,同时A项目依赖D项目的1.1版本,根据依赖传递则A项目中同时具有D项目的1.0、1.1版本,此时就存在依赖冲突
冲突解决

  • 谁先声明,谁有效,如下1.0版本先声明,故a项目中使用的是c项目的1.0版本
xml 复制代码
<!-- b项目依赖c项目1.0版本   -->
  <dependency>
    <groupId>org.example</groupId>
    <artifactId>maven-b</artifactId>
    <version>1.0-SNAPSHOT</version>
  </dependency>
  
  <!-- b项目依赖c项目1.1版本   -->
  <dependency>
    <groupId>org.example</groupId>
    <artifactId>maven-b</artifactId>
    <version>1.1-SNAPSHOT</version>
  </dependency>
  • 直接引入比依赖传递更具优先性,如下a项目直接引入c项目,故a项目中c项目的1.1版本生效
xml 复制代码
<!-- b项目依赖c项目1.0版本   -->
  <dependency>
    <groupId>org.example</groupId>
    <artifactId>maven-b</artifactId>
    <version>1.0-SNAPSHOT</version>
  </dependency>
  
  <!-- a目直接项依赖c项目1.1版本   -->
  <dependency>
    <groupId>org.example</groupId>
    <artifactId>maven-c</artifactId>
    <version>1.1-SNAPSHOT</version>
  </dependency>
  • 排除依赖,直接排除b项目中的c依赖,故而a项目使用c项目的1.1版本
xml 复制代码
<!-- b项目依赖c项目1.0版本   -->
<dependency>
  <groupId>org.example</groupId>
  <artifactId>maven-b</artifactId>
  <version>1.0-SNAPSHOT</version>
  <exclusions>
    <exclusion>
      <groupId>org.example</groupId>
      <artifactId>maven-b</artifactId>
    </exclusion>
  </exclusions>
</dependency>

<!-- b项目依赖c项目1.1版本   -->
<dependency>
  <groupId>org.example</groupId>
  <artifactId>maven-b</artifactId>
  <version>1.1-SNAPSHOT</version>
</dependency>

2.4 依赖阻断

  • 当项目b被其它项目引用时,不传递c依赖
xml 复制代码
  <dependency>
    <groupId>org.example</groupId>
    <artifactId>maven-c</artifactId>
    <version>1.0-SNAPSHOT</version>
    <optional>true</optional>
  </dependency>

3. 仓库

仓库分类:仓库分为本地仓库、中央仓库、远程仓库,其中本地仓库即个人配置的本地仓库、远程仓库即公司配置的私服仓库、中央仓库即为apache或阿里配置的仓库

3.1 仓库配置

3.1.1 本地仓库

xml 复制代码
<localRepository>D:\repo</localRepository>

3.1.2 中央仓库-阿里云仓库配置

xml 复制代码
<mirrors>
  <mirror>
    <id>alimaven</id>
    <mirrorOf>central</mirrorOf>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  </mirror>
</mirrors>

4. 生命周期

生命周期:maven有三种生命周期,clean、default、site,每个生命周期又包含不同的阶段,后一阶段的执行都必须先执行前一阶段指令后才执行下一阶段指令

|--------------------|------------|-------------------------|-------------|
| 生命周期 | clean | default | site |
| 阶段(phase),执行顺序由上至下 | pre-clean | validate | pre-site |
| 阶段(phase),执行顺序由上至下 | clean | initialize | site |
| 阶段(phase),执行顺序由上至下 | post-clean | generate-sources | post-site |
| 阶段(phase),执行顺序由上至下 | | process-sources | site-deploy |
| 阶段(phase),执行顺序由上至下 | | generate-resources | |
| 阶段(phase),执行顺序由上至下 | | process-resources | |
| 阶段(phase),执行顺序由上至下 | | compile | |
| 阶段(phase),执行顺序由上至下 | | process-classes | |
| 阶段(phase),执行顺序由上至下 | | generate-test-sources | |
| 阶段(phase),执行顺序由上至下 | | generate-test-resources | |
| 阶段(phase),执行顺序由上至下 | | process-test-resources | |
| 阶段(phase),执行顺序由上至下 | | test-compile | |
| 阶段(phase),执行顺序由上至下 | | process-test-classes | |
| 阶段(phase),执行顺序由上至下 | | test | |
| 阶段(phase),执行顺序由上至下 | | prepare-package | |
| 阶段(phase),执行顺序由上至下 | | package | |
| 阶段(phase),执行顺序由上至下 | | pre-integration-test | |
| 阶段(phase),执行顺序由上至下 | | integration-test | |
| 阶段(phase),执行顺序由上至下 | | post-integration-test | |
| 阶段(phase),执行顺序由上至下 | | verify | |
| 阶段(phase),执行顺序由上至下 | | install | |
| 阶段(phase),执行顺序由上至下 | | deploy | |
| 阶段(phase),执行顺序由上至下 | | |

5. 插件

maven插件的执行实际就是从中央仓库拉取插件jar包,然后通过执行对应命令方式来执行插件,因此当我们在执行插件时,卡着不动,可以考虑将阿里云中央仓库给注释掉,直接从apache中央仓库拉取

xml 复制代码
<build>
  <plugins>
    <!--配置编译插件,通常自带编译插件版本较老,因而我们需要重新配置 -->
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.1</version>
      <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <encoding>UTF-8</encoding>
      </configuration>
    </plugin>

    <!-- Javaweb项目我们可以通过配置tomcat插件来运行项目     -->
    <plugin>
      <groupId>org.apache.tomcat.maven</groupId>
      <artifactId>tomcat7-maven-plugin</artifactId>
      <version>2.2</version>
      <configuration>
        <!--端口控制-->
        <port>8080</port>
        <!--项目路径控制意味着http://localhost:8080/abc-->
        <path>/abc</path>
        <!--编码-->
        <uriEncoding>UTF-8</uriEncoding>
      </configuration>
    </plugin>
  </plugins>
</build>

6. 继承

  • 父工程pom
    • packaging为pom
    • modules中包含了子工程坐标
  • 子工程

6.2 可继承的pom元素

  • groupId:项目组 ID ,项目坐标的核心元素;
  • version:项目版本,项目坐标的核心元素;
  • properties:自定义的 Maven 属性;
  • dependencies:项目的依赖配置;
  • dependencyManagement:醒目的依赖管理配置;

6.3 dependencyManagement

父类通过dependencyManagement来控制所要引入的依赖和对应版本,子类根据选择,只需要引入对应坐标即可,无需重新定义版本号,从而来控制依赖版本,此时依赖只做依赖定义,并未进行依赖引入

xml 复制代码
<dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.83</version>
      </dependency>
    </dependencies>
  </dependencyManagement>
xml 复制代码
  <dependencies>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
    </dependency>
  </dependencies>

6.4 porperties

properties用于定义统一版本

xml 复制代码
<!-- 通过properties定义,通过${}方式使用 -->
<properties>
  <maven.compiler.source>8</maven.compiler.source>
  <maven.compiler.target>8</maven.compiler.target>
  <fastjson>1.2.83</fastjson>
</properties>

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>${fastjson}</version>
    </dependency>
  </dependencies>
</dependencyManagement>
相关推荐
火烧屁屁啦21 分钟前
【JavaEE进阶】初始Spring Web MVC
java·spring·java-ee
w_312345435 分钟前
自定义一个maven骨架 | 最佳实践
java·maven·intellij-idea
岁岁岁平安37 分钟前
spring学习(spring-DI(字符串或对象引用注入、集合注入)(XML配置))
java·学习·spring·依赖注入·集合注入·基本数据类型注入·引用数据类型注入
武昌库里写JAVA40 分钟前
Java成长之路(一)--SpringBoot基础学习--SpringBoot代码测试
java·开发语言·spring boot·学习·课程设计
Q_19284999061 小时前
基于Spring Boot的九州美食城商户一体化系统
java·spring boot·后端
张国荣家的弟弟1 小时前
【Yonghong 企业日常问题 06】上传的文件不在白名单,修改allow.jar.digest属性添加允许上传的文件SH256值?
java·jar·bi
ZSYP-S1 小时前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
yuanbenshidiaos1 小时前
C++----------函数的调用机制
java·c++·算法
是小崔啊2 小时前
开源轮子 - EasyExcel01(核心api)
java·开发语言·开源·excel·阿里巴巴
黄公子学安全2 小时前
Java的基础概念(一)
java·开发语言·python