maven 指定version不生效的问题

目录
  • maven 指定version不生效
  • 有关maven依赖中的version
    • 构件依赖解析机制
    • 通过配置或命令行参数去设置远程仓库检查更新的策略

maven 指定version不生效

在项目中依赖一个 spring-security 版本时, 发现未生效, 调用报错

由于项目是依赖了srpingBoot

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

只要加入spring-security的依赖, 哪怕指定了版本, 也会使用springBoot中的版本

找了半天, 发现把security的版本依赖放在maven的 dependencyManagement标签中即可

有关maven依赖中的version

构件依赖解析机制

1、首先判断依赖的范围是否为system,如果是system,直接从本地文件系统解析构件;

2、非system,需要根据依赖坐标计算仓库路径,然后先从本地仓库寻找构件,找到构件解析成功;

3、如果本地仓库找不到,再判断版本号是否为明确版本号,如果版本号明确,会从远程仓库下载相应版本的构件;

4、如果版本号不明确,如 RELEASE、LATEST 和 SNAPSHOT,Maven 就需要根据远程仓库更新策略来检查更新

  • 当RELEASE或者LATEST时,则会基于更新策略读取远程仓库的maven-metadata.xml,然后将其与本地仓库对应的元数据合并且计算出 RELEASE或LATEST的实际值,再根据这个真实的版本号值检查本地和远程仓库(步骤2、3)
  • 当为SNAPSHOT时,则会基于更新策略读取远程仓库的maven-metadata.xml,然后将其与本地仓库对应元数据合并且得到最新快照版本的值,再根据这个最新的快照版本号值检查本地和远程仓库(步骤2、3)

通过配置或命令行参数去设置远程仓库检查更新的策略

  • always
  • daily
  • interval
  • never

配置方式:

<repository> 
    <id>xxx-snapshots</id>  
    <url>https://xxx/repository/maven-xxx-snapshots/</url>  
    <releases> 
        <enabled>true</enabled>
    </releases>  
    <snapshots> 
        <enabled>true</enabled>  
        <updatePolicy>always</updatePolicy> 
    </snapshots> 
</repository> 
  • SNAPSHOT

最新快照版本:

即使本地仓库已缓存,仍然会根据更新策略去远程仓库检查构件是否更新,然后下载最新时间戳的构件。

当maven 检测到需要依赖一个Snashot版本时,就会尝试从所有的远程仓库下载对应的meta文件,并在与本地的meta文件进行merge,得到一个与{0.1.0-SNAPSHOT}并带有时间戳的最新的版本号{0.1.0-20210910.091638-3},然后再尝试下载该版本。

<dependency>
     <groupId>com.etoak</groupId>
     <artifactId>test</artifactId>
     <version>SNAPSHOT</version>
 </dependency>
  • RELEASE

最新发布版本:

如果本地仓库没有缓存,会去远程仓库获取;如果本地仓库已缓存,即使远程仓库同一版本号有更新,也不再去远程仓库获取。

<dependency>
     <groupId>com.etoak</groupId>
     <artifactId>test</artifactId>
     <version>RELEASE</version>
 </dependency>
  • LATEST

最新版本:

下载最新的SNAPSHOT或者最新的RELEASE,不推荐使用。

<dependency>
     <groupId>com.etoak</groupId>
     <artifactId>test</artifactId>
     <version>LATEST</version>
 </dependency>

指定依赖的版本范围:

<dependency>
     <groupId>com.etoak</groupId>
     <artifactId>test</artifactId>
     <version>[1.0.1,)</version>
 </dependency>

范围说明:

Range Meaning
1.0 x >= 1.0 * The default Maven meaning for 1.0 is everything (,) but with 1.0 recommended. Obviously this doesn't work for enforcing versions here, so it has been redefined as a minimum version.
(,1.0] x <= 1.0
(,1.0) x < 1.0
[1.0] x == 1.0
[1.0,) x >= 1.0
(1.0,) x > 1.0
(1.0,2.0) 1.0 < x < 2.0
[1.0,2.0] 1.0 <= x <= 2.0
(,1.0],[1.2,) x <= 1.0 or x >= 1.2. Multiple sets are comma-separated
(,1.1),(1.1,) x != 1.1

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Maven多模块及version修改的实现方法

    对于使用maven构建的java项目,通常聚合多个子模块项目.在版本迭代的过程中经常变更版本号,更新parent版本号,发现子模块版本号没有更新,需要一个个的手动去更新,太麻烦,且容易出错. 在版本更新之后,内部模块之间的依赖也需要变更,往往存在遗漏. MAVEN多个子模块项目 以上是一个基本的 主项目parent包 maven-multily-module/pom.xml 指定整个应用的dependencyManagement 定义项目的发布的仓库地址distributionManagemen

  • 关于maven依赖 ${xxx.version}报错问题

    目录 maven依赖 ${xxx.version}报错 在pom文件加入以下配置即可解决 maven依赖的版本号报错解决(玄学) 玄学解决 maven依赖 ${xxx.version}报错 pom.xml 引入依赖时,版本取<version>${xxx.version}</version>有时会报红, 在pom文件加入以下配置即可解决 <properties> <xxx.version>版本号</xxx.version> </propert

  • maven依赖的version声明控制方式

    目录 maven依赖的version声明控制 下面以springcloud的注册中心模块举例 maven设置依赖version属性 1.加入profiles 2.version处用${name}替代 maven依赖的version声明控制 在写新的springcloud项目时 启动报错Correct the classpath of your application so that it contains a single, compatible version of ........ 大意是确

  • maven 指定version不生效的问题

    目录 maven 指定version不生效 有关maven依赖中的version 构件依赖解析机制 通过配置或命令行参数去设置远程仓库检查更新的策略 maven 指定version不生效 在项目中依赖一个 spring-security 版本时, 发现未生效, 调用报错 由于项目是依赖了srpingBoot <parent>     <groupId>org.springframework.boot</groupId>     <artifactId>spr

  • web.xml中Maven占位符不生效问题记录分析

    目录 问题背景 问题分析 Resources插件有三个目标: 问题定位 问题解决 问题背景 开发反馈,一个spring mvc的web项目,在web.xml配置的占位符不生效,编译后还是没有替换成配置的属性,如下: <context-param> <param-name>logbackConfigLocation</param-name> <param-value>classpath:${loagback.xml.path:logback.xml}</

  • maven依赖版本没有按照最短路径原则生效的解决方案

    女朋友他们项目用了 spring-boot,以 spring-boot-parent 作为 parent: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.9</version> </parent> 女朋友最近想用 elast

  • Maven 多profile及指定编译问题的解决

    目录 Maven 多profile及指定编译 要点 实例 Maven 指定编译版本 javac maven Maven 多profile及指定编译 要点 项目A依赖项目B,项目A.B都有对应的多个profile,通过mvn –P参数指定profile,只对A生效,对B不生效 项目A.B模块位于同一父项目,父项目构建时指定profile,可以传给A,B项目,A.B都使用同一指定的profile. 也可在父项目中定义属性,激活子项目profile,意即父项目 profile属性可传给各个子项目. 项

  • 一文掌握Java开发工具Maven(简单上手)

    Maven 如果作为一个Java程序员,那么在日常的开发过程中,maven是很常见的项目构建工具.maven可以极大的提高我们的开发效率,帮助我们简化开发过程中一些解决依赖和项目部署的相关问题,所以学习掌握maven的相关知识是非常有必要的. 本文从入门安装开始,逐步深入讲解maven的相关知识. 1.安装maven 首先我们需要准备好安装包,这里推荐在官网下载:maven官网下载地址 我这里下载的是3.8.1版本的maven,不同版本的maven配置过程基本是一样的. 1.1 Windows安

  • 熟悉maven:使java开发变得更高效

    目录 1.安装maven 1.1 Windows安装 1.2 Linux安装 1.3 简单配置 1.3.1 配置本地仓库路径 1.3.2 配置镜像 1.4 idea配置 2.Maven简单上手 3.Maven生命周期 4.POM文件详解 4.1.基础介绍 4.2.dependencies&dependency 4.3.dependencyManagement 4.4.properties 4.5.构建配置 4.6.仓库配置 4.7.项目配置信息(了解即可) 5.Maven依赖 6.聚合和继承 6

  • 关于Maven的使用,这些你都真的了解么

    Maven使用说明及规范 此文档主要说明Maven的基础使用方式,以及在使用过程过程中需要遵守哪些默认的准则. 我们工作中会经常写maven的配置,但是很多maven使用细节你可能并不知道,但你掌握后使用maven会更加上手. MAVEN是什么? Apache Maven是一个软件项目管理工具.基于项目对象模型(POM)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告和文档. Maven的核心是一个插件执行框架, 所有工作都是通过插件完成的. 最熟悉的插件如我们比较常用的: cle

  • 深入理解Maven的坐标与依赖

    在前边两节中,我们学习了Maven的基本概念以及何为Maven仓库,并且如何配置settings.xml文件等相关知识点.Maven的主要作用是可以帮助我们自动下载在pom.xml中配置添加的依赖.那么在本节中,我们将学习如何引入依赖. 知识点包括: Maven的坐标,Maven的依赖配置,依赖范围,传递性依赖,依赖调解,可选依赖,排除依赖,归类依赖和优化依赖 Maven的坐标 Maven的仓库中拥有着无数的构件,每一个构件都是一个jar或者war等文件,如果没有坐标,那么我们将无法唯一标识该构

  • Maven插件构建Docker镜像的实现步骤

    背景 微服务架构下,微服务在带来良好的设计和架构理念的同时,也带来了运维上的额外复杂性,尤其是在服务部署和服务监控上.单体应用是集中式的,就一个单体跑在一起,部署和管理的时候非常简单,而微服务是一个网状分布的,有很多服务需要维护和管理,对它进行部署和维护的时候则比较复杂. 下面从Dev的角度来看一下Ops的工作.从Dev提交代码,到完成集成测试的一系列步骤如下: 首先是开发人员把程序代码更新后上传到Git,然后其他的事情都将由Jenkins自动完成. 然后Git在接收到用户更新的代码后,会把消息

  • Maven profile实现不同环境的配置管理实践

    前言 目前,企业项目的开发过程中,往往会使用配置文件来做一些配置项来实现项目部署的灵活性,避免硬编码的方式在环境变化时需要对代码进行重新编译.但是往往在项目周期中存在着各种环境:如开发环境.测试环境以及生产环境等,而且在不同的运行环境中可能牵扯到大量的配置项变化.如果在不同的部署环境中切换,对配置文件的管理往往容易让程序员感觉非常的混乱. 为了避免这种换乱,研发过程中也有比较多的手段进行.比如,有公司就采用VPN的虚拟网络环境,让测试环境.生产环境的网络一致,让程序员在不同环境中对版本进行发布时

随机推荐