Maven学习(3)-依赖管理-POM文件中依赖的版本管理

pom.xml中依赖的定义样例:

<dependencies>
  <dependency>
     <groupId>org.mybatis.spring.boot</groupId>
     <artifactId>mybatis-spring-boot-starter</artifactId>
     <version>2.1.1</version>
  </dependency>
</dependencies>

但是,实际使用中,会发现pom.xml中很多依赖是没有指定<version>的,如:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

为什么呢?这就涉及到Maven中依赖的版本管理。

实际项目开发中,一个项目包含很多模块,不同模块有不同的依赖,也有多个模块存在共同的依赖。如:

希望一个项目中,不同模块使用的同一依赖采用相同的版本。可以:

(1)方式一:在每个模块的pom.xml文件中指定依赖版本,人为确保不同模块的pom.xml中相同依赖版本号一致。这样会导致维护复杂,后续如果变更依赖版本,需要每个模块排查修改。

(2)方式二:把所有的模块的依赖,都在根目录的pom.xml定义,然后被所有子模块引用。这样会导致子模块引用冗余,对于子模块不需要的依赖,也会被引用过来。

(3)方式三:maven提供了更好的方式,即maven依赖的版本管理:

整个项目,在根pom.xml中通过<dependencyManagement>标签定义依赖的版本:

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>org.eclipse.persistence</groupId>
          <artifactId>org.eclipse.persistence.jpa</artifactId>
          <version>1.3</version>
        </dependency>
        <dependency>
          <groupId>javax</groupId>
          <artifactId>javaee-api</artifactId>
          <version>2.1.1</version>
        </dependency>
      </dependencies>
    </dependencyManagement>

根目录的pom.xml作为每个模块pom.xml的父pom(通过在pom.xml文件中用<parent>指定),在模块的pom.xml仅指定依赖,不指定版本即可:

  <dependencies> 
      <dependency> 
        <groupId>org.eclipse.persistence</groupId> 
        <artifactId>org.eclipse.persistence.jpa</artifactId> 
      </dependency> 
      <dependency> 
        <groupId>javax</groupId> 
        <artifactId>javaee-api</artifactId> 
      </dependency> 
    </dependencies>

实际上,maven在解析子模块的pom.xml文件中依赖时,采用的就是父pom中<dependencyManagement>标签定义的版本。

<dependencyManagement>和<dependencies>的区别:

(1)<dependencyManagement>用于定义依赖版本,并不是真实的依赖,所以maven在解析pom.xml文件时并不会把<dependencyManagement>内的内容作为真实依赖来做查找更新动作。

(2)<dependencies>是真实的依赖,maven在解析pom.xml时,需要进行查找更新。

通过IDEA等创建的项目,项目根pom.xml中也存在没有版本号的依赖,其版本号如何确定呢?

原因是:Maven为所有项目提供了公共的父pom,在项目的根pom.xml文件中通过<parent>引用。项目根pom.xml中也存在没有版本号的依赖,集成的是Maven父pom中通过依赖版本管理定义的版本。

原文地址:https://www.cnblogs.com/yickel/p/12256589.html

时间: 2024-07-31 20:59:24

Maven学习(3)-依赖管理-POM文件中依赖的版本管理的相关文章

Maven学习(3)-依赖管理-POM文件中依赖的范围定义

来源: https://www.cnblogs.com/best/p/9676515.html#_lab2_1_2 https://www.cnblogs.com/kabi/p/8509049.html POM文件中的依赖可以通过<scope>标签定义依赖范围: <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.1

Maven的Pom文件中的隐式依赖导致Jar包冲突的问题

在一次的maven项目中遇到这样一个bug: 编译器没有报什么错,但无法编译,或者能编译,项目启动不了.后来我才发现是以下的问题: 项目中的pom文件中,依赖了webx3.core,而webx3.core又隐式依赖了fasttext相关的jar包,同时我在pom中也引人了fasttext.all, fasttext.all也隐式依赖了fasttext相关的jar包,两类jar包版本还不一样,这样就导致了jar包冲突的问题,牵扯到的pom文件依赖如下: <dependency><group

maven项目,导入的jar包,没有包含在pom文件中,install失败

[INFO] BUILD FAILURE[INFO] ------------------------------------------------------------------------[INFO] Total time: 3.608s[INFO] Finished at: Thu Feb 05 10:50:14 CST 2015[INFO] Final Memory: 17M/45M[INFO] -------------------------------------------

阿里规范 - 六、工程结构 - (二)二方库依赖 - 9. 【推荐】所有 pom 文件中的依赖声明放在&lt;dependencies&gt;语句块中,所有版本仲裁放在 &lt;dependencyManagement&gt;语句块中。

9. [推荐]所有 pom 文件中的依赖声明放在<dependencies>语句块中,所有版本仲裁放在 <dependencyManagement>语句块中. 说明:<dependencyManagement>里只是声明版本,并不实现引入,因此子项目需要显式的声明依 赖,version 和 scope 都读取自父 pom.而<dependencies>所有声明在主 pom 的<dependencies>里 的依赖都会自动引入,并默认被所有的子项目

idea中的pom文件中的jar包下载不了,手动下载jar包的方法

问题描述: 在pom文件中添加依赖的时候,程序怎么着都是下载不了,而且实验了各种方式: https://www.cnblogs.com/a8457013/p/7811519.html(可以参考,但是本人使用无效) 求取无果,只能自己下载到本地仓库在使用吧: 参考下面博客,可以将jar包下载然后安装到本地,非常感谢大家的分享:特此记录一笔. https://www.cnblogs.com/czy16/p/7569628.html http://www.cnblogs.com/tangshengwe

maven setting 配置仓库,pom.xml中repository不起作用

问题描述 最近做java项目,需要使用公司自己搭建的maven仓库,但是有些包公司的仓库中没有,导致下载失败. 项目环境 jdk:1.8 maven:3.5 问题原因分析 maven的setting文件配置信息如下: <?xml version="1.0" encoding="UTF-8"?> <settings> <localRepository>/data/repository</localRepository>

Idea中maven项目pom文件中已引入testng但项目文件中无法引入@Test

问题: 1.Idea中maven项目的pom.xml文件中引入依赖testng 2.此时可以看到已经出现testng的jar包,ERPLogin.java中引用@Test发现无法引用,然后直接import org.testng.annotations.Test也无法显示 3.但是在test目录下能引用到testng 原因: 在pom.xml文件引用testng的时候,有个标签<scope>test</scope>限制了只能在test目录下使用 1 <dependency>

关于使用命令添加jar进自己的pom文件中-maven项目添加jar包

现在几乎开发项目都是使用的maven项目,但是有的时候可以使用比较偏门或者新的jar可能在网上搜不到在pom文件里的配置应该如何写,因此写下这篇博客. 比如我现在想加入的AAA.jar这个包 打开cmd,在里面输入命令 mvn install:install-file -Dfile=想添加jar包的位置(比如E:/AAA.jar) -DgroupId=这个包放在你本地库的位置(例如com.公司名.你这个包的相关起这个名 com.xxxx.BBB) -DartifactId=BBB -Dversi

maven的pom文件中指定编译的版本

<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> <enc