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

本文摘要

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


文章目录

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


1. 坐标


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

1.1 坐标含义

<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版本
<!-- 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版本生效
<!-- 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版本
<!-- 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依赖
  <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 本地仓库

<localRepository>D:\repo</localRepository>

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

<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,每个生命周期又包含不同的阶段,后一阶段的执行都必须先执行前一阶段指令后才执行下一阶段指令

生命周期cleandefaultsite
阶段(phase),执行顺序由上至下pre-cleanvalidatepre-site
cleaninitializesite
post-cleangenerate-sourcespost-site
process-sourcessite-deploy
generate-resources
process-resources
compile
process-classes
generate-test-sources
generate-test-resources
process-test-resources
test-compile
process-test-classes
test
prepare-package
package
pre-integration-test
integration-test
post-integration-test
verify
install
deploy

5. 插件

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

<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来控制所要引入的依赖和对应版本,子类根据选择,只需要引入对应坐标即可,无需重新定义版本号,从而来控制依赖版本,此时依赖只做依赖定义,并未进行依赖引入

<dependencyManagement><dependencies><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version></dependency></dependencies></dependencyManagement>
  <dependencies><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId></dependency></dependencies>

6.4 porperties

properties用于定义统一版本

<!-- 通过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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/109574.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络地址转换NAT-动态NAT的使用范围和配置-思科EI,华为数通

网络地址转换NAT-动态NAT的使用范围和配置 什么是动态NAT&#xff1f; 使用公有地址池&#xff0c;并以先到先得的原则分配这些地址。当具有私有 IP 地址的主机请求访问 Internet 时&#xff0c;动态 NAT 从地址池中选择一个未被其它主机占用的 IP 地址一对一的转化。当数据会话…

Go几种读取配置文件的方式

比较有名的方案有 使用viper管理配置[1] 支持多种配置文件格式&#xff0c;包括 JSON,TOML,YAML,HECL,envfile&#xff0c;甚至还包括Java properties 支持为配置项设置默认值 可以通过命令行参数覆盖指定的配置项 支持参数别名 viper[2]按照这个优先级&#xff08;从高到低&am…

Linux驱动 - 20230828

练习. 驱动代码&#xff1a; #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/cdev.h> #include <linux/device.h> #include <linux/slab.h> #include <linux/uaccess.h> #include <…

Viobot硬件组成和接口

Viobot主要由主板、传感器板和外壳组成。具体尺寸可以在用户手册上面找到。 传感器板上面是双目摄像头和IMU&#xff0c;摄像头已经打了胶固定在外壳的前脸&#xff0c;由于涉及到传感器外参标定&#xff0c;所以不可自行拆卸。 LED补光灯版本&#xff1a; TOF版本&#xff1a…

2023-8-28 n-皇后问题

题目链接&#xff1a;n-皇后问题 第一种搜索顺序 #include <iostream>using namespace std;const int N 20;int n; char g[N][N]; bool row[N], col[N], dg[N], udg[N];void dfs(int x, int y, int s) {if(y n) y 0, x ;if(x n){if(s n){for(int i 0; i < n;…

【 Python 全栈开发 - 人工智能篇 - 45 】集成算法与聚类算法

文章目录 一、集成算法1.1 概念1.2 常用集成算法1.2.1 Bagging1.2.2 Boosting1.2.2.1 AdaBoost1.2.2.2 GBDT1.2.2.3 XgBoost 1.2.3 Stacking 二、聚类算法2.1 概念2.2 常用聚类算法2.2.1 K-means2.2.2 层次聚类2.2.3 DBSCAN算法2.2.4 AP聚类算法2.2.5 高斯混合模型聚类算法 一、…

第三方系统访问微搭低代码的后端API

微搭低代码使用的是文档型数据库&#xff0c;有时候会有数据集成的需求&#xff0c;将低代码的数据库中的数据抽取到第三方系统中。本篇就介绍一下本地抽取数据以及云函数中抽取数据 1 本地抽取数据 本地抽取数据我们以nodejs作为后端服务&#xff0c;本机要求先安装好nodejs…

构建数据可视化(基于Echarts,python)

构建数据可视化&#xff08;基于Echarts,python) 本文目录&#xff1a; 一、写在前面的题外话 二、数据可视化概念 三、用Python matplotlib库绘制数据可视化图 四、基于Echarts构建大数据可视化 4.1、安装echarts.js 4.2、数据可视化折线图制作 4.2.1、基础折线图 4.2…

JWT-Token

一、JWT 需要在 HTTP 这种无状态的机制下&#xff0c;记录下&#xff08;标识&#xff09;出来是不是连续&#xff08;逻辑上的连续&#xff09;的请求。 思路&#xff1a;如果多次请求&#xff0c;携带了相同的标识型数据&#xff0c;则认为是逻辑上连续的。这个标识&#xff…

【数据结构】 栈与队列的相互实现

文章目录 &#x1f30f;引言&#x1f340;[队列实现栈](https://leetcode.cn/problems/implement-stack-using-queues/)&#x1f431;‍&#x1f3cd;题目描述&#xff1a;&#x1f4cc;注意事项&#xff1a;&#x1f4cc;示例与提示&#xff1a; &#x1f431;‍&#x1f409;…

云计算在线实训系统建设方案

一、 人工智能与云计算系统概述 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一种模拟人类智能的科学和工程&#xff0c;通过使用计算机系统来模拟、扩展和增强人类的智能能力。人工智能涉及多个领域&#xff0c;包括机器学习、深度学习、自然…

2023全国大学生数学建模竞赛B题思路模型代码

目录 一.思路模型见文末名片&#xff0c;比赛开始9.7晚上第一时间更新 二.国赛常用算法之随机森林 3.思路获取见此 一.思路模型见文末名片&#xff0c;比赛开始9.7晚上第一时间更新 二.国赛常用算法之随机森林 # -*- coding: utf-8 -*- """ author: Administ…

实用调试技巧(1)

文章目录 目录1. 什么是bug&#xff1f;2. 调试是什么&#xff1f;有多重要&#xff1f;2.1 调试是什么&#xff1f;2.2 调试的基本步骤2.3 Debug和Release的介绍 3. Windows环境调试介绍3.1 调试环境的准备3.2 学会快捷键3.3 调试的时候查看程序当前信息3.3.1 查看临时变量的值…

身为程序员,你有哪些提高写代码效率的工具?

首先&#xff0c;每个程序员都是会利用工具的人&#xff0c;也有自己囊里私藏的好物。独乐乐不如众乐乐&#xff0c;今天笔者整理了3个辅助我们写代码的黑科技&#xff0c;仅供参考。如果你有更好的工具&#xff0c;欢迎评论区分享。 1、Google/Stackoverflow——搜索解决方案的…

作为Android 开发,该如何写好自己的简历……

不管在那个行业、那家公司、那个岗位&#xff0c;你去应聘面试&#xff0c;首先人家第一眼看的肯定是你的简历&#xff0c;先通过简历来初步判断你的能力&#xff0c;再到通知面试进行考察。所以简历是一张很重要牌&#xff0c;就看你怎么打了&#xff1f; 笔者本科毕业&#…

Vue2向Vue3过度Vuex核心概念mutations

目录 1 核心概念-mutations1.定义mutations2.格式说明3.组件中提交 mutations4.练习5.总结 2 带参数的 mutations1.目标&#xff1a;2.语法2.1 提供mutation函数&#xff08;带参数&#xff09;2.2 提交mutation 3 练习-mutations的减法功能1.步骤2.代码实现 4 练习-Vuex中的值…

EXSI技术--Exsi简介与安装

1.EXSI简介 了解可直接安装到您的物理服务器的、可靠的裸机 Hypervisor。通过直接访问并控制底层资源,VMware ESXi可有效地对硬件进行分区,以便整合应用并降低成本。它是业界领先的高效体系架构,在可靠性、性能和支持方面树立了行业标杆。(裸金属架构) VMware vSphere的虚拟…

Python科研绘图--Task05

目录 SciencePlots 安装SciencePlots 安装LaTeX ① 安装 MikTex 和 Ghostscript ② 将软件的安装路径添加到系统环境变量中 SciencePlots 绘图示例 SciencePlots 虽然 Matplotlib 或 ProPlot 库能够绘制出插图结果&#xff0c;但用户还需要根据期刊的配图绘制要求进行…

Ubuntu22.04安装中文输入法►由踩坑到上岸版◄

Ubuntu22.04安装中文输入法►由踩坑到上岸版◄ 了解入坑上岸 更新一发&#xff1a;Gedit中文乱码问题的解决 为了方便回忆和记录甚至后面继续重装系统&#xff0c;我还是写一下以便将来用到或参考&#xff5e; 了解 安装Ubuntu22.04&#xff08;截至2023年08月26日11&#xff…

打开软件报错mfc100u.dll缺失是什么意思?简单式修复mfc100u.dll问题

首先&#xff0c;我们需要了解什么是MFC100U.dll文件以及它的作用。MFC100U.dll是一个Microsoft Foundation Class (MFC)库文件&#xff0c;它是Visual C应用程序开发的一部分。MFC库提供了许多通用的功能&#xff0c;如窗口管理、消息处理等&#xff0c;可以帮助开发者更快速地…