maven项目继承依赖中包版本的说明

news2024/12/27 7:15:19

                                                 继承

参考博客MAVEN的继承详解_parent中哪些标签可以被子项目继承_32224047_yw的博客-CSDN博客

https://blog.csdn.net/liupeifeng3514/article/details/80236827 

dependencies 和dependencyManagement

在Maven多模块的时候,管理依赖关系是非常重要的,各种依赖包冲突,查询问题起来非常复杂,于是就用到了<dependencyManagement>,

示例说明,

在父模块中:

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.44</version>
            </dependency>
           
        </dependencies>
</dependencyManagement>
那么在子模块中只需要<groupId>和<artifactId>即可,如:
 <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
 </dependencies>

说明:
使用dependencyManagement可以统一管理项目的版本号,确保应用的各个项目的依赖和版本一致,不用每个模块项目都弄一个版本号,不利于管理,当需要变更版本号的时候只需要在父类容器里更新,不需要任何一个子项目的修改;如果某个子项目需要另外一个特殊的版本号时,只需要在自己的模块dependencies中声明一个版本号即可。子类就会使用子类声明的版本号,不继承于父类版本号。

与dependencies区别:

1)Dependencies相对于dependencyManagement,所有生命在dependencies里的依赖都会自动引入,并默认被所有的子项目继承。
2)dependencyManagement里只是声明依赖,并不自动实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。

也就是说如果我们在父类中直接 

<dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
 </dependencies>

 那么父类中注入了这个bean并且继承这个父类的子类也会继承这个bean也就是说子类中也有了这个bean。

plugins 和 pluginManagement 的区别

plugins 和 pluginManagement 的区别,和我们前面研究过的 dependencies 和 dependencyManagement 的区别是非常类似的。plugins 下的 plugin 是真实使用的,而 pluginManagement 下的 plugins 下的 plugin 则仅仅是一种声明,子项目中可以对 pluginManagement 下的 plugin 进行信息的选择、继承、覆盖等。

pluginManagement使用实战
假如存在两个项目,项目A为项目B的父项目,其关系通过pom文件的关系确定。项目A的父pom文件片段如下:

<pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>2.1</version>
            <configuration>
                <attach>true</attach>
            </configuration>
            <executions>
                <execution>
                    <phase>compile</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</pluginManagement>

如果项目B也想使用该plugin配置,则在项目B的子pom文件中只需要如下配置:

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


我们可以看到,子pom文件中,省去了版本、配置细节等信息,只需要指定groupId和artifactId,其他信息均从父pom文件继承。当然,如果子pom文件想定制自己的特定内容,可以另行设置,并会覆盖从父pom文件继承到的内容。

需要注意的是,dependencies 和 dependencyManagement 均是 project 下的直接子元素,但是 plugins 和 pluginManagement 却是 project 下 build 的直接子元素

拓展

下面是子项目可以从父项目中继承的东西

那么父pom文件中哪些元素可以被继承呢?

groupId:项目组ID,项目坐标的核心元素
version:项目版本,项目坐标的核心元素
description:项目的描述信息
organization:项目的组织信息
properties:自定义的Maven属性
dependencies:项目的依赖配置
repositories:项目的仓库配置
build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等
reporting:包括项目的报告输出目录配置、报告插件配置等。
dependencyManagement:项目的依赖管理配置
pluginManagement  插件管理
————————————————
                                                     

                                 依赖一个项目

我们在微服务项目的时候经常会出现一个项目依赖另一个微服务项目的时候,通常就是微服务项目依赖一个·base工程,或者一个content_api工程依赖一个content_service工程。

这时候我们的依赖jar包是怎么一个情况呢?

事实上我们一个项目依赖另一个项目会依赖这个项目中依赖的其他jar包,但是这时候如果我们本项目中有这些jar包,那么服从就近原则。

依赖冲突与解决
   依赖冲突:一个项目A,通过不同依赖传递路径依赖于X,若在不同路径下传递过来的X版本不同,那么A应该导入哪个版本的X包呢?

    冲突解决方案:

    1:如果依赖路径的长度不同,则“短路优先”:
         A—>B—>C—>D—>E—>X(version 0.0.1)
         A—>F—>X(version 0.0.2)
         则A依赖于X(version 0.0.2)。

     2:依赖路径长度相同情况下,则“先声明优先”:
         A—>E—>X(version 0.0.1)
         A—>F—>X(version 0.0.2)
         则在项目A的<depencies></depencies>中,E、F那个在先则A依赖哪条路径的X。
————————————————

从图中可以看出来我们的api项目依赖了service项目,但是对于service中依赖的包我们没有的当然就是依赖这个项目中的包了,但是有的根据就近原则直接依赖我们api中的jar包。

除了依赖的jar包还会依赖什么东西呢。比如我们spring容器中的bean以及我们的配置文件bootstrap.yaml会不会产生依赖呢。(bean不是依赖的而是spring进行扫描的)

SpringBoot应用启动时,默认会自动扫描与启动类在同个包以及子包下的Bean,那么我们依赖的service工程只要我们的文件所在包的位置正确,并且使用了@Srvice类似的注解,那么就会被我们的spring扫描到。

在Spring Boot中,包扫描是由@SpringBootApplication注解所标注的启动类进行扫描的。

@SpringBootApplication是一个复合注解,包含了多个元注解,其中之一是@ComponentScan。@ComponentScan注解指示Spring扫描和注册指定包及其子包中所有的组件(包括带有@Controller、@Service、@Repository和@Configuration等注解的类)到Spring容器中。

当启动Spring Boot应用程序时,它会自动扫描启动类所在包及其子包中的组件,并将这些组件自动注册到Spring容器中。这样,在应用程序中可以通过依赖注入(@Autowired)或者使用其他方式来使用这些被注册的组件。

需要注意的是,Spring Boot默认情况下,会扫描启动类所在包及其子包中的组件。如果启动类不在根包(root package)中,那么需要通过@ComponentScan注解的value属性或basePackages属性来指定要扫描的包。例如:

@SpringBootApplication @ComponentScan(basePackages = "com.example.myapp") public class MyAppApplication { // ... }

上述示例中,指定了要扫描的包为"com.example.myapp",并会将该包及其子包中的组件注册到Spring容器中。

对于bootstrap中配置文件会不会进行依赖。我想

 

 

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

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

相关文章

冠达管理:上市破发是什么意思?

随着股票商场的开展&#xff0c;一些公司开端考虑走向上市&#xff0c;以取得更多的资金和更高的知名度。然而&#xff0c;上市并不总是一件功德。当一家公司的股票开端买卖时&#xff0c;如果它的股价远低于发行价&#xff0c;就可以说它遭遇了“破发”。这是一种负面事件&…

【CAD二次开发】重新加载acad.pgp快捷菜单文件

为了加快绘图速度&#xff0c;好多人会进行CAD快捷命令的修改&#xff0c;那怎么在不需要重启CAD的情况下自动更新&#xff1f; CAD修改acad.pgp,快捷命令后&#xff0c;自动更新。 方法一 命令行输入reinit&#xff0c;命令。 在弹出的窗口中&#xff0c;选择‘PGP文件’&…

【Linux详解】——共享内存

&#x1f4d6; 前言&#xff1a;本期介绍共享内存。 目录 &#x1f552; 1. 共享内存的原理&#x1f552; 2. 共享内存的概念&#x1f558; 2.1 接口认识&#x1f558; 2.2 演示生成key的唯一性&#x1f558; 2.3 再谈key &#x1f552; 3. 共享内存相关命令&#x1f552; 4. 利…

气象站是什么设备?功能是什么?

气象站是一种用于测量和记录气象数据的设备。它通常是由各种传感器及其数据传输设备、固定设备和供电设备组成&#xff0c;可以测量风速、风向、温度、湿度、气压、降水量等气象要素&#xff0c;并将这些数据记录下来&#xff0c;以便进一步分析和研究。 气象站通常设置在广阔…

从MySQL数据库中查出时间与数据库存储的时间不一致

1、TimeZone t TimeZone.getDefault(); 通过该方法查看系统的时区。 2、select global.time_zone,session.time_zone; 查看数据库的时区 3、在application.properties中配置&#xff1a; #SpringBoot默认的是Jackson框架转换&#xff0c;而Jackson默认的时间时区是GMT&…

动作分析:提升效率、改进质量、创新流程的秘密武器

动作分析的主要的用途和目的是排除多余的动作、无效的动作或缓慢的动作&#xff0c;如弯腰、站在凳子上、蹲着、工作场所差、缺少合适的工作设备、处于搜索状态的人和事等&#xff0c;形成标准化作业规范&#xff0c;从而通过最省力的方法达到最大的工作效率。这项研究可以不花…

为什么良好的客户服务对于成功的企业至关重要

图片来源于&#xff1a;SaleSmartly官网 良好的客户服务是任何成功企业的重要组成部分。提供卓越的客户服务有助于建立客户的信任和忠诚度&#xff0c;从而增加销售额和利润。它还对任何企业的声誉产生积极影响&#xff0c;带来更多客户和更好的口碑推荐。因此&#xff0c;企业…

【FusionInsight 迁移】HBase从C50迁移到6.5.1(03)6.5.1上准备Loader

【FusionInsight 迁移】HBase从C50迁移到6.5.1&#xff08;03&#xff09;6.5.1上准备Loader HBase从C50迁移到6.5.1&#xff08;03&#xff09;6.5.1上准备Loader登录新集群FusionInsight 6.5.1的Manager准备Loader服务准备Loader Role准备Loader User HBase从C50迁移到6.5.1&…

商家为什么要做微信小程序开发

一、引言 在移动互联网时代&#xff0c;微信已经成为人们生活中不可或缺的社交工具。微信小程序作为微信的一个重要扩展&#xff0c;以其轻便、易用、无需下载等特性&#xff0c;正在受到越来越多的关注。本文将详细探讨为什么需要进行微信小程序开发&#xff0c;以及微信小程…

Nacos Helm Chart Deploy Demo

文章目录 介绍准备条件定制 values.yaml检查登陆 介绍 Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供…

华为云Stack的学习(五)

六、华为云stack服务简介 1.云服务在华为云Stack中的位置 云服务对接多个数据中心资源池层提供的资源&#xff0c;并向各种行业应用提供载体。 2.华为云Stack通用服务 2.1 云计算的服务模式 2.2 计算相关的云服务 2.3 存储相关的云服务 2.4 网络相关的云服务 3.云化案例 **…

VSCode 中的用户代码片段

用户代码块 在 VSCode 中&#xff0c;用户可以通过自定义代码片段&#xff08;User Snippets&#xff09;来快速插入常用的代码块。 官方文档 如何创建和使用用户代码片段&#xff1a; 点击用户片段后&#xff0c;即会弹出面板如下&#xff1a; 添加一个代码片段 "片…

elasticsearch wildcard 慢查询原因分析(深入到源码!!!)

大家好&#xff0c;我是蓝胖子&#xff0c;前段时间线上elasticsearch集群遇到多次wildcard产生的性能问题&#xff0c; elasticsearch wildcard 一直是容易引发elasticsearch 容易宕机的一个风险点&#xff0c; 但究竟它为何消耗cpu呢&#xff1f;又该如何理解elasticsearch p…

深圳-海岸城购物中心数据分析

做数据分析的时候&#xff0c;如果要对商场进行分析&#xff0c;可以从这些数据纬度进行分析&#xff0c;如下图所示&#xff1a; 截图来源于数位观察&#xff1a;https://www.swguancha.com/

【JPC出版】第二届能源与电力系统国际学术会议 (ICEEPS 2023)

第二届能源与电力系统国际学术会议 (ICEEPS 2023) 2023 2nd International Conference on Energy and Electrical Power Systems 第二届能源与电力系统国际学术会议 (ICEEPS 2023)将于2023年10月27日至29日在中国厦门举行。ICEEPS 将汇集能源科学、电气工程和电力系统领域的…

Windows中多线程的基础知识——2事件对象

上一节我们介绍了线程同步、以及利用互斥对象实现线程同步的方法。这一节&#xff0c;我们继续介绍另一种线程同步的方法&#xff1a;事件对象。如果对线程概念、互斥对象概念不清楚的同学&#xff0c;请查看Windows中多线程的基础知识——1互斥对象。 1 事件对象 1.1 事件对…

SAP MM BP供应商主数据学习实践总结

一 常用Tcode 基于Tcode的顺序排列 供应商主数据物料主数据货源清单配额安排采购信息记录采购订单框架协议采购询价/报价采购申请订单收货发票校验物料需求计划BP-供应商主数据MM01 - 物料主数据新增ME01 - 维护MEQ1 - 维护ME11 - 创建ME21N - 创建框架协议-合同:询价:ME51…

LeetCode 133. Clone Graph【图,DFS,BFS,哈希表】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

Tequila Works x Incredibuild

关于 Tequila Works Tequila Works 是一家位于西班牙马德里的电子游戏开发商&#xff0c;由劳尔鲁比奥 (Raul Rubio) 和卢兹桑乔 (Luz Sancho) 于2009年创立。该公司著名的游戏产品包括《死亡曙光》(Deadlight)、《霜华》(Rime)、《联盟外传&#xff1a;努努之歌》(Song of Nu…

革命性的电子元件:RAD继电器 | 百能云芯

在现代电子和通信系统中&#xff0c;RAD继电器是一种关键的电子元件&#xff0c;它在各种应用中发挥着重要作用。RAD继电器&#xff08;Reed-relay Actuated Device&#xff09;是一种基于磁性原理的电子开关&#xff0c;其特点是极其高速、可靠、低功耗和长寿命。下面云芯将为…