Maven基础知识大梳理

目录
  • Maven工程基础知识
    • Maven仓库的分类
    • Maven常用命令的含义
    • 一个项目生命周期
    • 打包类型:<packaging >
    • 依赖范围:<scope>
    • 聚合与继承的关系
  • 依赖冲突
    • 依赖调节原则
    • 解决依赖冲突-使用MavenHelper

Maven工程基础知识

maven 工程中不直接将 jar 包导入到工程中,而是通过在 pom.xml 文件中添加所需 jar包的坐标,这样就很好的避免了 jar 直接引入进来,在需要用到 jar 包的时候,只要查找 pom.xml 文件,再通过 pom.xml 文件中的坐标,到一个专门用于”存放 jar 包的仓库”(maven 仓库)中根据坐标从而找到这些 jar 包,再把这些 jar 包拿去运行。

为了解决这个过程中速度慢的问题,maven 中也有索引的概念,通过建立索引,可以大大提高加载 jar 包的速度

Maven仓库的分类

本地仓库 :用来存储从远程仓库或中央仓库下载的插件和 jar 包,项目使用一些插件或 jar 包,优先从本地仓库查找

远程仓库:如果本地需要插件或者 jar 包,本地仓库没有,默认去远程仓库下载(私服)。

中央仓库:在 maven 软件中内置一个远程仓库地址https://www.mvnrepository.com/ ,它是中央仓库,服务于整个互联网。

Maven常用命令的含义

compile:编译--- compile 是 maven 工程的编译命令,作用是将 src/main/java 下的文件编译为 class 文件输出到 target目录下。

clean:清理--- clean 是 maven 工程的清理命令,执行 clean 会删除 target 目录及内容。

test:测试--- test 是 maven 工程的测试命令 mvn test,会执行 src/test/java 下的单元测试类。

package:打包---package 是 maven 工程的打包命令,对于 java 工程执行 package 打成 jar 包,对于 web 工程打成 war包。

install:安装--- install 是 maven 工程的安装命令,执行 install 将 maven 打成 jar 包或 war 包发布到本地仓库

一个项目生命周期

打包类型:<packaging >

jar:执行 package 会打成 jar 包

war:执行 package 会打成 war 包

pom :用于 maven 工程的继承,通常父工程设置为 pom

依赖范围:<scope>

A 依赖 B,需要在 A 的 pom.xml 文件中添加 B 的坐标,添加坐标时需要指定依赖范围,依赖范围包括:

compile:compile指 A 在编译时依赖 B,此范围为默认依赖范围。编译范围的依赖会用在编译、测试、运行,由于运行时需要所以编译范围的依赖会被打包。

provided:provided 依赖只有在当 JDK 或者一个容器已提供该依赖之后才使用, provided 依赖在编译和测试时需要,在运行时不需要,比如:servlet api 被 tomcat 容器提供。

runtime:runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如:jdbc的驱动包。由于运行时需要所以 runtime 范围的依赖会被打包。

test:test 范围依赖 在编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用,比如:junit。由于运行时不需要所以 test范围依赖不会被打包。

system:system 范围依赖与 provided 类似,但是你必须显式的提供一个对于本地系统中 JAR文件的路径,需要指定 systemPath 磁盘路径,system依赖不推荐使用。

依赖范围由强到弱的顺序是:compile>provided>runtime>test

pom文件中常用标签的含义

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
 <!--声明项目描述符遵循哪一个POM模型版本。4.0.0-->

    <groupId>com.tfjybj</groupId>
    <artifactId>super</artifactId>
    <packaging>pom</packaging>
    <version>1.0.0-SNAPSHOT</version>

    <!--项目的名称, Maven产生的文档用-->
    <name>super</name>
    <!-- 项目的详细描述, Maven 产生的文档用。-->
    <description>super</description>

    <!--聚合  来管理同个项目中的其他模块-->
    <modules>
        <module>super-common</module>
        <module>super-gateway</module>
        <module>super-zipkin</module>
        <module>super-provider</module>
        <module>super-provider-api</module>
    </modules>

    <!--继承  说明这是一个boot工程-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
    </parent>

    <!--统一管理jar包版本-->
    <properties>
        <!--项目编码方式,maven编译版本-->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
          <!--统一管理jar包版本-->
        <spring.cloud.version>2.1.0.RELEASE</spring.cloud.version>
        <spring.boot.version>2.1.8.RELEASE</spring.boot.version>
        <mysql.version>6.0.6</mysql.version>
    </properties>

    <!--统一管理版本号-->
    <!--在父工程pom文件中声明依赖,但不引入,父项目声明,供子项目按需引入-->
    <dependencyManagement>
        <dependencies>
            <!-- nacos服务注册/发现-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
                <version>${spring.cloud.version}</version>
                 <!--排除ribbon的依赖-->
               <exclusions>
                   <exclusion>
                       <groupId>org.springframework.cloud</groupId>
                       <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <!--nacos配置中心来做配置管理-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
                <version>${spring.cloud.version}</version>
            </dependency>
             <!--mysql-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
               <!--  mysql依赖的作用范围-->
                <scope>runtime</scope>
            </dependency>

        </dependencies>
    </dependencyManagement>

    <!--所有声明在父项目 dependencies 中的依赖都会自动引入,并默认被所有子项目继承-->
    <!--即使在子项目中不引入该依赖,那么子项目依然会从父项目中继承该依赖项。-->
    <dependencies>

    </dependencies>

    <!--发现依赖和扩展的远程仓库列表  -->
    <!--远程仓库列表,它是Maven用来填充本地仓库所使用的一组远程项目。 -->
    <repositories>
        <!--包含需要连接到远程仓库的信息-->
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>

    <!--用于项目打包,打包需要的插件-->
     <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

聚合与继承的关系

 1、聚合主要是为了方便快速构建项目,继承主要是为了消除重复配置

  2、对于聚合模块而言,它知道有哪些被聚合的模块,但那些被聚合的模块不知道这个聚合模块的存在;对于继承的父pom 而言,它不知道有哪些子模块继承它,但那些子模块都必须知道自己的父pom 是什么

  3、聚合pom 与继承中的父pom 的 packaging 都必须是 pom;同时,聚合模块与继承中的父模块除了 pom 外,都没有实际的内容

依赖冲突

Maven的依赖机制会导致Jar包的冲突。

举个例子,现在你的项目中,使用了两个Jar包,分别是A和B。现在A需要依赖另一个Jar包C,B也需要依赖C。但是A依赖的C的版本是1.0,B依赖的C的版本是2.0。这时候,Maven会将这1.0的C和2.0的C都下载到你的项目中,这样你的项目中就存在了不同版本的C,这时Maven会依据依赖路径最短优先原则,来决定使用哪个版本的Jar包,而另一个无用的Jar包则未被使用,这就是所谓的依赖冲突。

依赖调节原则

1.第一声明者优先原则

在pom文件定义依赖,以先声明的依赖为准。

谁先在pom.xml中申明,就用谁的。跟坐标代码的顺序有关

2.路径近者优先原则

以上两个jar包都依赖了spring-beans。

spring-context和spring-webmvc都会传递过来spring-beans,那如果直接把spring-beans的依赖写在pom文件中,那么项目就不会再使用其他依赖传递过来的spring-beans。

因为自己直接在pom中定义spring-beans要比其他依赖传递过来的路径要近。

3.排除依赖原则

使用Maven中的<exclusions>标签,例如

     <!--使用的openfeign-->
     <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.2.1.RELEASE</version>
            <exclusions>
                 <exclusion>
                     <groupId>org.springframework.cloud</groupId>
                     <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
                 </exclusion>
            </exclusions>
     </dependency>

4.锁定版本原则

面对众多的依赖,有一种方法不用考虑依赖路径、声明优化等因素可以采用直接锁定版本的方法确定依赖构件的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本的为准添加到工程中,此方法在企业开发中常用。

解决依赖冲突-使用MavenHelper

在idea中下载插件mavenHelper解决依赖冲突,使用步骤看图

找到冲突,点击右键,然后选择Exclude即可排除冲突版本的Jar包。

以上就是Maven基础知识大梳理的详细内容,更多关于Maven基础知识的资料请关注我们其它相关文章!

(0)

相关推荐

  • 一篇文章带你搞定JAVA Maven

    目录 1.maven是什么,为什么存在?项目结构是什么样子,怎么定位jar 2.Idea 的操作 1.新建maven项目 2.配置仓库 3.添加依赖,添加fastjson的依赖 4.打包项目 3.Maven坐标主要组成 4.maven生命周期 4.1 名词解释 4.2 生命周期 4.3 goal 的概念 4.4 生命周期和phase的关系 5.idea maven的配置 6.POM有2个很重要的关系:聚合.继承 一.聚合 二.继承 7.Maven 中的 profile 8.maven 插件 9.

  • maven的pom文件与打包详解

    目录 一.基础配置 1.<parent> 标签 1)使用 spring-boot-starter-parent 2)使用自定义 parent 2.classifier 元素 3.classifier 的用途: 二.构建配置 字段说明 三.profile 配置 四.springboot 打包配置 打包插件 1.Maven 项目结构 2.打包时资源文件的配置 (1)打包 src/main/java 目录下的 xml (2)src/main/resources 目录下的 xml 等资源文件不被打包

  • maven环境变量配置讲解

    maven运行依赖于 JAVA_HOME 如果各位还没有配置 JAVA_HOME,可以参考我的另一篇博客 JDK环境变量配置 JDK 环境变量配置 1.下载并解压 maven压缩包 官方下载地址为:http://maven.apache.org/download.cgi 2.配置系统环境变量 MAVEN_HOME 和 path MAVEN_HOME:maven解压后的路径 3.打开CMD输入 mvn -v 查看maven是否配置成功,如图所示,则表示maven环境变量配置成功 至此 maven环

  • JSON,AJAX,Maven入门基础

    目录 一,JSON –1,概述 –2,测试 二,AJAX –1,概述 –2,语法 –3,测试 三,Maven –1,概述 –2,核心组件 –3,使用步骤 总结 一,JSON –1,概述 JSON是一种轻量级的数据交换格式. 指定了 浏览器 和 服务器 之间数据传输的格式. –2,测试 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 JSON的语法&l

  • 基于idea Maven中的redis配置使用详解

    pom.xml文件需要的内容 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> &

  • Maven基础知识大梳理

    目录 Maven工程基础知识 Maven仓库的分类 Maven常用命令的含义 一个项目生命周期 打包类型:<packaging > 依赖范围:<scope> 聚合与继承的关系 依赖冲突 依赖调节原则 解决依赖冲突-使用MavenHelper Maven工程基础知识 maven 工程中不直接将 jar 包导入到工程中,而是通过在 pom.xml 文件中添加所需 jar包的坐标,这样就很好的避免了 jar 直接引入进来,在需要用到 jar 包的时候,只要查找 pom.xml 文件,再通

  • javascript基础知识大集锦(一) 推荐收藏

    next:js正则表达式,闭包,apply,callee,事件相关函数,Cookie等 1.javascript的数组API //定义数组 var pageIds = new Array(); pageIds.push('A'); 数组长度 pageIds.length; //shift:删除原数组第一项,并返回删除元素的值:如果数组为空则返回undefined var a = [1,2,3,4,5]; var b = a.shift(); //a:[2,3,4,5] b:1 //unshift

  • javascript基础知识大集锦(二) 推荐收藏

    详细看附件例子,还是写的比较简单的. 1.关于cookie的函数: 复制代码 代码如下: /** * cookie操作工具. * 使用方法:保存值:CookieTool('name','1',{expires: 7}) //表示保存一个cookie值为1,键值为name,失效时间7天以后 * 取值:CookieTool('name') //返回1 * @param {} name * @param {} value * @param {} options * @return {} */ Cook

  • C++超详细梳理基础知识

    目录 命名空间的使用 来源 命名空间的使用 不展开 部分展开 全展开 函数重载 函数重载的规则 C++如何实现函数重载 引用 命名空间的使用 来源 在了解命名空间的原理和使用之前,我们先要理解,命名空间是为了解决什么问题. C++是在C的基础上发展而形成的一种语言,完全兼容C的语法,也加入了许多新的规则和语法来解决C的缺陷. 命名空间就是为了解决C语言中的重复命名的问题. 首先我们来看看这么一个代码: #include<stdio.h> int main() { int scanf = 20;

  • 快速学习MySQL基础知识

    这篇文章主要梳理了 SQL 的基础用法,会涉及到以下方面内容: SQL大小写的规范 数据库的类型以及适用场景 SELECT 的执行过程 WHERE 使用规范 MySQL 中常见函数 子查询分类 如何选择合适的 EXISTS 和 IN 子查询 了解 SQL SQL 是我们用来最长和数据打交道的方式之一,如果按照功能划分可分为如下 4 个部分: DDL,数据定义语言.定义数据库对象,数据表,数据列.也就是,对数据库和表结构进行增删改操作. DML,数据操作语言.对数据表的增删改. DCL,数据控制语

  • Java基础知识汇总

    Java基础知识 1.Java语言的优点: 1)Java是纯面向对象语言 2)与平台无关性,一次编译到处运行 3)Java提供了狠多内置类库 4)提供了对web应用的支持 5)具有较好的安全性(数组边界检测.Bytecode检测)和健壮性(强制型机制.垃圾回收器.异常处理) 6)去除c++难以理解的一些特性(头文件 指针 运算符重载 多重继承) 2.java与c++的异同: 1)Java为解释型语言,c++为编译型语言,java会慢但是跨平台 2)Jave为纯面向对象,c++既面向对象又能面向过

  • IOS开发之路--C语言基础知识

    概览 当前移动开发的趋势已经势不可挡,这个系列希望浅谈一下个人对IOS开发的一些见解,这个IOS系列计划从几个角度去说IOS开发: C语言 OC基础 IOS开发(iphone/ipad) Swift 这么看下去还有大量的内容需要持续补充,但是今天我们从最基础的C语言开始,C语言部分我将分成几个章节去说,今天我们简单看一下C的一些基础知识,更高级的内容我将放到后面的文章中. 今天基础知识分为以下几点内容(注意:循环.条件语句在此不再赘述): Hello World 运行过程 数据类型 运算符 常用

  • iOS10推送之基础知识(必看篇)

    前言 在北京时间9月14号凌晨1点,苹果正式推送iOS 10正式版,下面给大家详细的介绍iOS10推送的基础知识,在看完简单入门篇大家就可以简单适配了,然后再通过中级篇的内容,相信对大家学习理解有很大的帮助,下面话不多说了,来看看吧. 一.简单入门篇 相对简单的推送证书以及环境的问题,我就不在这里讲啦,我在这里说的,是指原有工程的适配. 1.首先我们需要打开下面的开关.所有的推送平台,不管是极光还是什么的,要想收到推送,这个是必须打开的哟~ 之后,系统会生成一个我们以前没见过的文件,如图: 可能

  • JavaScript常用基础知识强化学习

    首先,还是用比较官方的文字描述来解释下JavaScript: JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能. JavaScript拥有以下几个特点: · 脚本语言.JavaScript是一种解释型的脚本语言,C.C++等语言先编译后执行,而JavaScript是在程序的运行

  • Python基础知识_浅谈用户交互

    1.raw_input(): raw_input()是python 的内建函数,通过读取控制台的输入与用户实现交互. raw_input()可以让用户输入字符串(即等待用户输入内容),并存放到一个变量里. #!/usr/bin/env python # -*- coding:utf-8 -*- #将用户输入的内容赋值给变量user user = raw_input("请输入用户名:") #将用户输入的内容赋值给变量pwd pwd = raw_input("请输入密码:&quo

随机推荐