Maven从入门到好难

news2025/2/25 11:09:53

参考文献
永远最好的官网
超赞maven系列文章

1. 为啥要有maven

想当初,刚毕业刚工作,之前学的C++,java不懂,部门用的Spring,于是开始学习SSM,妈的,jar包好难整,还要一个个下载好放到libs目录中。
后来遇到好几次jar包冲突,还好有maven的idea插件,才让问题快速找到原因。
因此maven可以解决

  1. jar包的下载难
  2. jar包版本之间的依赖问题
  3. jar包版本冲突【maven并没有很好的解决,工作还是经常遇到jar包冲突的问题,这个时候你需要一个排查思路】
  4. 项目的目录结构不同
  5. 项目的生命周期控制方式五花八门

官方解释什么是maven:maven是apache软件基金会组织维护的一款自动化构建工具,专注服务于java平台的项目构建和依赖管理

2. maven的安装

3. maven的配置文件,重点之中【待完善】

这块其实水很深,不同的maven版本和配置都有可能导致最终打出来的包不一样。
曾经我们就遇到配置的不同导致打出来的包不同,最后导致线上问题,真的是。。。。。太难了。。。

4. maven约定的项目配置

在这里插入图片描述

4.1 通过idea查看项目依赖

在这里插入图片描述

4.2 idea maven helper插件

查包依赖,排包的好工具!!!

4.3 pom导入jar包格式

<dependencies>
        <!-- 在这里添加你的依赖 -->
        <dependency>
            <groupId></groupId>
            <artifactId></artifactId>
            <version></version>
            <!--依赖的类型,表示所要依赖的构件的类型,对应于被依赖的构件的packaging。大部分情况下,该元素不被声明,默认值为jar,表示被依赖的构件是一个jar包。还有pom等-->
            <type></type>
            <!--依赖的范围 重点!!!-->
            <scope></scope>
            <!--标记依赖是否可选-->
            <optional></optional>
            <!--用来排除传递性的依赖 排包重点!!!-->
            <exclusions>
                <exclusion></exclusion>
                <exclusion></exclusion>
            </exclusions>
        </dependency>
    </dependencies>

4.4 重点的scope

控制jar包是否打包到项目的classpath中。
在这里插入图片描述
还有一个import

有的时候我们会从在项目中加第三方的jar包,因为都是私有的项目,他们只给了一个jar包,maven仓库中没有,那这个时候怎么办呢?

4.5 用mvn deploy到自己的私有仓库中

mvn install:install-file -Dfile=D:\*.*-1.0.jar -DgroupId=*.* -DartifactId=*-* -Dversion=1.0 -Dpackaging=jar

在这里插入图片描述

4.6 使用system

似乎这里和上述文章说的不一致,那我们来搞个测试。
在这里插入图片描述

发现打完包之后的确没有这个jar包。需要注意的是:使用第二种方式导入的jar包,因为scope指定的是system类型,因此打包时并不会被打入到最终的jar中;如果需要和项目一起打包则需要使用springboot的打包插件。

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
    	<!--设置为true,以便把本地的system的jar也包括进来-->
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>

在这里插入图片描述

4.7 maven解析pom中依赖调解的原则

  • 路径最近原则
    上面A->B->C->Y(1.0),A->D->Y(2.0),Y的2.0版本距离A更近一些,所以maven会选择2.0。

但是如果出现了路径是一样的,如:A->B->Y(1.0),A->D->Y(2.0),此时maven又如何选择呢?

  • 最先声明原则
    如果出现了路径一样的,此时会看A的pom.xml中所依赖的B、D在dependencies中的位置,谁的声明在最前面,就以谁的为主,比如A->B在前面,那么最后Y会选择1.0版本。

这两个原则就是解决jar包冲突的理论依据,必须理解!!!!:路径最近原则、最先声明原则

4.8 optional选项作用

官网介绍
排包还有一个思路

A->B中scope:compile
B->C中scope:compile

如果我们不想引入C
那么就可以在B项目中引入Cjar包的时候把optional设置为true。

5. maven仓库

一句话:maven引包只是一个引用,在最终打包后才会在包中。

5.1 仓库的分类

  • 本地仓库
    maven本地仓库默认地址是~/.m2/respository目录,这个默认我们也可以在~/.m2/settings.xml文件中进行修改:
<localRepository>本地仓库地址</localRepository>
  • 私有仓库
    自己公司的maven私有仓库,有可能工作的时候这个仓库就需要你维护或者搭建。
    maven的私有仓库现在也有两个不同的版本了: Nexus 2/3。文件存储的格式好像又比较大的改动。。。。

总体上来说私服有以下好处:

加速maven构件的下载速度
节省宽带
方便部署自己的构件以供他人使用
提高maven的稳定性,中央仓库需要本机能够访问外网,而如果采用私服的方式,只需要本机可以访问内网私服就可以了
  • 中央仓库
    不需要我们配置,他是写好在maven中,如下地方
apache-maven-3.6.1\lib\maven-model-builder-3.6.1.jar\org\apache\maven\model\pom-4.0.0.xml

仓库地址:

https://repo.maven.apache.org/maven2

访问一下
在这里插入图片描述
中仓仓库查找jar包的网站:https://search.maven.org/
在这里插入图片描述

新的中仓仓库查找jar包的网站:https://central.sonatype.com/
在这里插入图片描述

  • 其他公共远程仓库
    比如像阿里、网易等等

5.2 重点!!快照版本和正式版本

version以-SNAPSHOT结尾的,表示这是一个不稳定的版本,这个版本我们最好只在公司内部测试的时候使用,最终发布的时候,我们需要将-SNAPSHOT去掉,然后发布一个稳定的版本,表示这个版本是稳定的,可以直接使用,这种稳定的版本我们叫做release版本。

  1. 开发的时候使用快照版本,这个时候每次打包都会去拉去最新的版本,如果你改动的快照包的代码,就需要deploy后让引用的也无妨重新打包部署一下。。。
  2. 正式版本只要有了就不会再去私有仓库中拉取了。注意:有的时候本地搞出来了一个错误的正式包,但是因为是正式包,本地有了就不会去仓库中拉,所以这个时候需要手动删除本地的错误的包

5.3 Maven中远程仓库的配置

5.3.1. 使用项目的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>

    <groupId>com.javacode2018</groupId>
    <artifactId>maven-chat03</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <id>aliyun-releases</id>
            <url>https://maven.aliyun.com/repository/public</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

</project>

repository元素说明:

id:远程仓库的一个标识,中央仓库的id是central,所以添加远程仓库的时候,id不要和中央仓库的id重复,会把中央仓库的覆盖掉
url:远程仓库地址
releases:主要用来配置是否需要从这个远程仓库下载稳定版本构建
snapshots:主要用来配置是否需要从这个远程仓库下载快照版本构建
enabled属性,是个boolean值,默认为true,表示是否需要从这个远程仓库中下载稳定版本或者快照版本

5.3.2. settings.xml配置

太难了,搞不懂。。。。。

私有仓库搭建

最常用的是Nexus

6. maven插件

6.1 介绍

在这里插入图片描述

6.2 生命周期和阶段

每个生命周期中的后面的阶段会依赖于前面的阶段,当执行某个阶段的时候,会先执行其前面的阶段。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.3 mvn命令

如何执行mvn的命名

mvn 阶段1 [阶段2] [阶段n]

6.4 插件的目标和参数查看

  1. 列出插件所有目标 ,使用插件的help目标查看或者用help插件
mvn 插件goupId:插件artifactId[:插件version]:help
mvn 插件前缀:help

mvn help:describe -Dplugin=插件goupId:插件artifactId[:插件version]
mvn help:describe -Dplugin=插件前缀
  1. 查看插件目标参数列表,使用-Dgoal=目标名称 -Ddetail参数查看目标参数或者用help插件
mvn 插件goupId:插件artifactId[:插件version]:help -Dgoal=目标名称 -Ddetail
mvn 插件前缀:help -Dgoal=目标名称 -Ddetail

mvn help:describe -Dplugin=插件goupId:插件artifactId[:插件version] -Dgoal=目标名称 -Ddetail
mvn help:describe -Dplugin=插件前缀 -Dgoal=目标名称 -Ddetail
  1. 命令行运行插件
mvn 插件goupId:插件artifactId[:插件version]:插件目标 [-D目标参数1] [-D目标参数2] [-D目标参数n]
mvn 插件前缀:插件目标  [-D目标参数1] [-D目标参数2] [-D目标参数n]
  1. 查看插件的前缀
mvn help:describe -Dplugin=插件goupId:插件artifactId[:插件version]

在这里插入图片描述

6.5 插件的目标和生命周期阶段绑定

<build>
        <plugins>
            <plugin>
            	<!-- 插件 -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <!-- 插件需要执行的任务 -->
                    <execution>
                        <!-- 任务的id,需唯一,如果不指定,默认为default -->
                        <id>attach-source</id>
                        <!-- 任务中插件的目标,可以指定多个 -->
                        <goals>
                            <goal>jar-no-fork</goal>
                        </goals>
                        <!-- 绑定的阶段 -->
                        <phase>verify</phase>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

查看插件的默认绑定,和查看参数一样

mvn help:describe -Dplugin=插件goupId:插件artifactId[:插件version] -Dgoal=目标名称 -Ddetail
mvn help:describe -Dplugin=插件前缀 -Dgoal=目标名称 -Ddetail
 ~/work/ mvn help:describe -Dplugin=source -Dgoal=jar-no-fork -Ddetail
[INFO] Mojo: 'source:jar-no-fork'
source:jar-no-fork
  Description: This goal bundles all the sources into a jar archive. This
    goal functions the same as the jar goal but does not fork the build and is
    suitable for attaching to the build lifecycle.
  Implementation: org.apache.maven.plugins.source.SourceJarNoForkMojo
  Language: java
  Bound to phase: package

  Available parameters:
  Bound to phase: package

6.6 插件传参的方式

6.6.1. mvn命令-D属性名称的方式传递

mvn 插件goupId:插件artifactId[:插件version]:插件目标 [-D目标参数1] [-D目标参数2] [-D目标参数n]

6.6.2. pom.xml中properties中定义的方式指定。

<properties>
	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
	<java.version>1.8</java.version>
	<maven.test.skip>true</maven.test.skip>
</properties>

6.6.3. pom的plugin里配置插件的参数

6.6.3.1 插件目标共享参数配置
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.12.4</version>
            <!-- 插件参数配置,对插件中所有的目标起效 -->
            <configuration>
                <skip>true</skip>
            </configuration>
        </plugin>
    </plugins>
</build>
6.6.3.2 插件目标参数配置
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.12.4</version>
            <executions>
                <execution>
                    <goals>
                        <goal>test</goal>
                        <goal>help</goal>
                    </goals>
                    <phase>pre-clean</phase>
                    <!-- 这个地方配置只对当前任务有效 -->
                    <configuration>
                        <skip>true</skip>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

6.7.插件仓库配置

<pluginRepositories>
    <pluginRepository>
        <id>myplugin-repository</id>
        <url>http://repo1.maven.org/maven2/</url>
        <releases>
            <enabled>true</enabled>
        </releases>
    </pluginRepository>
</pluginRepositories>

7 maven的聚合、继承、单继承问题

7.1 聚合也就是多模块

这里没啥好说的,实际看过就知道了,但是重点讲一下

<modules>
    <module>模块1</module>
    <module>模块2</module>
    <module>模块n</module>
</modules>
<package>pom</package>

注意上面的module元素,这部分是被聚合的模块pom.xml所在目录的相对路径。

package的值必须为pom。

7.2 多模块中子构件的pom.xml引入父构件的配置:

<parent>
   <groupId>父构件groupId</groupId>
   <artifactId>父构件artifactId</artifactId>
   <version>父构件的版本号</version>
   <relativePath>父构件pom.xml路径</relativePath>
</parent>

relativePath表示父构件pom.xml相对路径,默认是…/pom.xml,所以一般情况下父子结构的maven构件在目录结构上一般也采用父子关系。单有的时候是评级的,这个时候就需要relativePath正确的配置了。

mvn dependency:tree 这个插件可以根据pom.xml的配置,列出构件的依赖树信息。
也可以用来排包

7.3 依赖管理(dependencyManagement)

maven提供的dependencyManagement元素既能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性,在dependencyManagement元素下声明的依赖不会引入实际的依赖,他只是声明了这些依赖,不过它可以对dependencies中使用的依赖起到一些约束作用。

父项目写好dependencyManagement做好版本管理,子项目引用的时候不需要写版本。

7.4 单继承的问题和解决

如上,dependencyManagement可以让子项目配置更简单。
但是实际开发中我们自己的项目就是多模块的,此时又想引入其他项目的dependencyManagement怎么办呢?

7.4.1 回到scope中没有说的import

可以在我们的项目中使用加入下面配置:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.javacode2018</groupId>
            <artifactId>javacode2018-parent</artifactId>
            <version>1.0-SNAPSHOT</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>构件2</dependency>
        <dependency>构件3</dependency>
        <dependency>构件n</dependency>
    </dependencies>
</dependencyManagement>

<scope>import</scope>就可以做到这个效果,相当于把导入的配置像C语言的宏定义一样使用。

7.5 插件管理(pluginManagement)

和依赖管理(dependencyManagement)管理一样,父项目配置好插件,子项目也可以不配置版本了。

父项目

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <execution>
                        <id>attach-source</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>jar-no-fork</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

子项目

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
        </plugin>
    </plugins>
</build>

聚合主要是为了方便多模块快速构建。
而继承主要是为了重用相同的配置。
对于聚合来说,聚合模块是知道被聚合模块的存在的,而被聚合模块是感知不到聚合模块的存在。
对于继承来说,父构件是感知不到子构件的存在,而子构件需要使用parent来引用父构件。
两者的共同点是,聚合模块和继承中的父模块的package属性都必须是pom类型的,同时,聚合模块和父模块中的除了pom.xml,一般都是没有什么内容的。
实际使用是,我们经常将聚合和继承一起使用,能同时使用到两者的优点。

8. 大神写的太好一定要看-mvn命令1

9. 大神写的太好一定要看-maven命令2

10. 排包

生个版本,嘿,项目启动报错。或者是启动不报错,运行报错。。。。如:

没有这个类 NoSuch
没有这个方法 NoSuch

如何处理呢:

  1. 通过报错信息查找到类->包,注意有的时候可能是类的静态初始化抛异常了
  2. 通过maven helper插件找到冲突的包
  3. 排包:A: 使用exclusions;B: 使用maven的依赖解析原则,直接在项目的pom文件中配置好版本,这样让maven首先就找到正确的版本。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单片机直驱两相四线步进电机研究

【本文发布于https://blog.csdn.net/Stack_/article/details/132236329&#xff0c;未经允许不得转载&#xff0c;转载须注明出处】 双极性步进电机&#xff08;两相四线步进电机&#xff09;&#xff0c;原理的东西就先不讲太多了&#xff0c;还没搞清楚&#xff0c;边查资料边…

ARTS 挑战打卡的第一周,我学到了这些~

目录 前言 一、学习的内容 二、超时怎么办那就换种思路看题解 三、学习打卡成果展示 3.1 Github的小技巧 3.2 英文文章阅读 3.3 一篇很不错的Java面试题博客 四、学习技巧的总结 前言 关于 ARTS 的释义 ● Algorithm: 每周至少做一个 LeetCode 的算法题 ● Review: 阅读…

Javascript异步编程的4种方法

你可能知道&#xff0c;Javascript语言的执行环境是"单线程"&#xff08;single thread&#xff09;。 所谓"单线程"&#xff0c;就是指一次只能完成一件任务。如果有多个任务&#xff0c;就必须排队&#xff0c;前面一个任务完成&#xff0c;再执行后面一…

使用selenium如何实现自动登录

回顾使用requests如何实现自动登录一文中&#xff0c;提到好多网站在我们登录过后&#xff0c;在之后的某段时间内访问该网页时&#xff0c;不会给出请登录的提示&#xff0c;时间到期后就会提示请登录&#xff01;这样在使用爬虫访问网页时还要登录&#xff0c;打乱我们的节奏…

【Linux】以太网协议——数据链路层

链路层解决的问题 IP拥有将数据跨网络从一台主机送到另一台主机的能力&#xff0c;但IP并不能保证每次都能够将数据可靠的送到对端主机&#xff0c;因此IP需要上层TCP为其提供可靠性保证&#xff0c;比如数据丢包后TCP可以让IP重新发送数据&#xff0c;最终在TCP提供的可靠性机…

数据通信——网络层(ACL)

引言 在网络中会区分三个区域&#xff1a;&#xff08;Trust&#xff09;内网&#xff0c;&#xff08;UnTrust&#xff09;外网&#xff0c;&#xff08;DM2&#xff09;非军事化区域 防火墙在网络中可以阻止DM2对Trust的访问。同理&#xff0c;从Trust到UnTrust或者UnTrust到…

STM32 CubeMX (uart_IAP串口)简单示例

STM32 CubeMX [TOC]( STM32 CubeMX (uart_IAP串口)简单示例) 前言 单片机flash有两部分1.IAP程序和2.APP程序&#xff1b;IAP是烧录工具烧录的&#xff0c;App是串口烧录的 #1.IAP程序设置,程序地址 #2.APP程序设置&#xff0c;程序地址 生成bin文件 fromelf.exe --bin -o …

2023高教社杯数学建模A题 B题C题 D题 E题思路代码分析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 全国大学生数学建模…

指针的进阶--从入门到入土

指针--变态加强版 前言面试题字符指针指针数组数组指针函数指针函数指针数组指向函数指针数组的指针面试题解析结语 前言 掌握指针这块知识的重要性不言而喻&#xff0c;当你觉得自己已经差不多掌握指针的时候&#xff0c;不妨看看下面8道面试题&#xff08;题目从简单到困难&…

三级城市展示省市区树

展示效果 数据库展示 业务代码 /*** 省市区树*/VLicenseApiOperation("查询经纬度")ApiImplicitParam(name "FnCity", value "省市区树", dataType "FnCity")GetMapping("/districtlist")public AjaxResult districtlist…

STM32F429IGT6使用CubeMX配置IIC通信(AT2402芯片)

1、硬件电路 写地址&#xff1a;0xA0 读地址&#xff1a;0xA1 存储容量&#xff1a;256Byte 2、设置RCC&#xff0c;选择高速外部时钟HSE,时钟设置为180MHz 3、配置IIC 4、生成工程配置 5、部分代码 #define IIC_WRITE_ADDR 0xA0 // IIC写地址 #define IIC_READ_ADDR 0xA1 …

数据结构----哈夫曼树

这里写目录标题 基本概念引子基本概念各种路径长度各种带权路径长度结点的带权路径长度树的带权路径长度哈夫曼树 哈夫曼树的构造理论基础构造思想总结 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录…

exec族函数

本节学习exec族函数&#xff0c;并大量参考了以下链接&#xff1a; linux进程---exec族函数(execl, execlp, execle, execv, execvp, execvpe)_云英的博客-CSDN博客 exec族函数函数的作用 我们用fork函数创建新进程后&#xff0c;经常会在新进程中调用exec函数去执行另外一个程…

从零构建深度学习推理框架-8 卷积算子实现

其实这一次课还蛮好理解的&#xff1a; 首先将kernel展平&#xff1a; for (uint32_t g 0; g < groups; g) {std::vector<arma::fmat> kernel_matrix_arr(kernel_count_group);arma::fmat kernel_matrix_c(1, row_len * input_c_group);for (uint32_t k 0; k < k…

【leetcode】前缀和

内容摘抄自&#xff1a; 小而美的算法技巧&#xff1a;前缀和数组 | labuladong 的算法小抄 一维数组的前缀和 看这个 preSum 数组&#xff0c;若想求索引区间 [1, 4] 内的所有元素之和&#xff0c; 就可以通过 preSum[5] - preSum[1] 得出。 class NumArray {private:// 前缀…

软件测试基础篇——Docker

1、docker技术概述 docker描述&#xff1a;docker是一项虚拟化的容器技术&#xff08;类似于虚拟机&#xff09;&#xff0c;docker技术给使用者提供一个平台&#xff0c;在该平台上可以利用提供的容器&#xff0c;对每一个应用程序进行单独的封装隔离&#xff0c;每一个应用程…

记录--用css画扇形菜单

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 1、效果图 用手机录屏再用小程序转换的gif&#xff0c;可能精度上有点欠缺。 2、实现过程 1、观察及思考 开始编码前我们首先观察展开后的结构&#xff1a;两个四分之一的圆加三个圆形菜单项。 文章名…

阿里云服务器部署Drupal网站教程基于CentOS系统

阿里云百科分享如何在CentOS 7操作系统的ECS实例上搭建Drupal电子商务网站。Drupal是使用PHP语言编写的开源内容管理框架&#xff08;CMF&#xff09;&#xff0c;它由内容管理系统&#xff08;CMS&#xff09;和PHP开发框架&#xff08;Framework&#xff09;共同构成。它用于…

【博客692】grafana如何解决step动态变化时可能出现range duration小于step

grafana如何解决step动态变化时可能出现range duration小于step 1、grafana中的step和resolution grafana中的 “step” grafana本身是没有提供step参数的&#xff0c;因为仪表盘根据查询数据区间以及仪表盘线条宽度等&#xff0c;对于不同查询&#xff0c;相同的step并不能…

编译redis-5.0.9报错zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录问题解决

上图 解决&#xff1a; make && make install MALLOClibc原因: 原因是jemalloc重载了Linux下的ANSI C的malloc和free函数。