首页 > 其他分享 >maven依赖传递

maven依赖传递

时间:2024-03-13 09:01:20浏览次数:21  
标签:传递 依赖 项目 作用域 Boot jar maven provided

maven依赖机制

1、优先原则

在这里插入图片描述

(1)A、B、C的依赖关系被定义为A -> B -> C -> D 2.0和A -> E - >d 1.0,那么构建A时将使用D 1.0,因为从A经过E到D的路径较短。你可以在a中显式地向D 2.0添加依赖,强制使用D 2.0,如下图所示:

在这里插入图片描述

(2)先声明者优先

2、排除依赖

如果项目X依赖于项目Y,项目Y依赖于项目Z,项目X的所有者可以使用“exclusion”元素显式地排除项目Z作为依赖项

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.0.5</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.xmlbeans</groupId>
                    <artifactId>xmlbeans</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

3、optional

如果项目Y依赖于项目Z,项目Y的所有者可以使用“optional”元素将项目Z标记为可选依赖。当项目X依赖于项目Y时,X将只依赖于Y而不依赖于Y的可选依赖项Z。项目X的所有者可以根据自己的选择显式地添加对Z的依赖项

4、显示的指定依赖

尽管传递依赖可以隐式地包含所需的依赖,但最好还是显式地指定源代码直接使用的依赖。尤其是当项目的依赖关系发生更改时。
例如,假设你的项目A依赖于另一个项目B,而项目B依赖于项目C。如果你直接在项目C中使用组件,而在项目A中没有指定项目C,那么当项目B突然更新/删除它对项目C的依赖时,可能会导致构建失败。
直接指定依赖关系的另一个原因是,你可以通过阅读项目中的POM文件或执行mvn dependency:tree来了解更多信息,阅读起来更加直观

5、Dependency Scope 依赖范围

compile

这是默认作用域,如果不指定则使用。编译依赖项在项目的所有类路径中都可用。此外,这些依赖关系会传播到依赖的项目。

provided

跟 compile 很像,但是如果希望在JDK或容器在运行时提供依赖项时采用。例如,在为Java企业版构建web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为作用域 provided ,因为web容器提供了这些类。具有此作用域的依赖会添加到用于编译和测试的类路径中,但不会添加到运行时类路径中。它是不可传递的。
在标准的 Maven 项目中,当依赖被设置为 provided 作用域时,Maven 在打包时(例如使用 mvn package)确实不会将这些依赖包含在生成的 JAR 或 WAR 文件中。这是因为这些依赖被假定为在运行时将由运行环境(如应用服务器或容器)提供。
然而,Spring Boot 的 Maven 插件在处理 provided 依赖时有所不同。Spring Boot 试图创建一个“可执行的 JAR”或“可部署的 WAR”,这意味着它希望尽可能地自包含,即使这些依赖项在标准 Maven 打包过程中会被排除。
在 Spring Boot 项目中,当你使用 spring-boot-maven-plugin 进行打包时,即使依赖被标记为 provided,它也可能被包含在最终的 JAR 或 WAR 文件中。Spring Boot 这样做的目的是为了简化部署和确保应用程序的独立性,特别是当部署到没有预安装依赖项的环境时。
对于 WAR 文件,Spring Boot 有一个特性,它会创建一个名为 WEB-INF/lib-provided 的目录,并将所有 provided 依赖放入这个目录。然而,这些依赖并不会被 Servlet 容器自动添加到类路径中。它们只是作为备份存在,以防容器没有提供这些依赖。实际上,在大多数情况下,lib-provided 目录中的 JAR 文件不会被使用,除非你明确配置容器去加载它们。
对于 JAR 文件,Spring Boot 通常会将所有依赖(包括 provided)打包到 BOOT-INF/lib 目录下。但是,由于 provided 依赖在运行时预期是由环境提供的,Spring Boot 在运行时不会将它们添加到类路径中。
如果你不希望 Spring Boot 将 provided 依赖包含在最终的 JAR 或 WAR 文件中,你可以尝试以下几种方法:
手动排除:在 spring-boot-maven-plugin 的配置中,使用 元素来手动排除特定的 provided 依赖。
使用 Maven 依赖管理:确保你的 pom.xml 文件中正确设置了依赖的范围为 provided。
考虑是否真正需要 provided:如果你确定依赖在运行时总是可用的(例如,因为你正在部署到一个总是提供这些依赖的特定环境中),那么使用 provided 作用域是合理的。否则,你可能需要重新考虑是否应该将这些依赖包含在最终包中。

runtime

此范围表明编译不需要依赖项,但执行需要依赖项。Maven在运行时和测试类路径中包含了这个作用域的依赖,但在编译类路径中没有。加了runtime的jar包在代码编写的时候是无法引用的

test

仅在测试编译和执行阶段可用

system

这个作用域类似于 provided ,必须在项目中引入此jar包,并且标注jar的位置

        <dependency>
          <groupId>dingding</groupId>
          <artifactId>dingding</artifactId>
          <version>2.8</version>
          <scope>system</scope>
          <systemPath>${project.basedir}/lib/taobao-sdk-java.jar</systemPath>
        </dependency>

import

此作用域仅支持 节中的类型 pom 。作用域为 import 的依赖实际上并不参与限制依赖的传递性

<groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-dependencies</artifactId>
  <version>2.4.0</version>
  <packaging>pom</packaging>
  <name>spring-boot-dependencies</name>
  <description>Spring Boot Dependencies</description>
  <dependencyManagement>
    <dependencies>
    <dependency>
        <groupId>io.dropwizard.metrics</groupId>
        <artifactId>metrics-bom</artifactId>
        <version>${dropwizard-metrics.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
</dependencyManagement>
    
<artifactId>metrics-bom</artifactId>
    <name>Metrics BOM</name>
    <packaging>pom</packaging>
    <description>Bill of Materials for Metrics</description>
     <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>io.dropwizard.metrics</groupId>
                <artifactId>metrics-annotation</artifactId>
                <version>${project.version}</version>
            </dependency>
     </dependencies>
</dependencyManagement>

compile、runtime和provided的区别,需要在执行mvn package命令,且打包格式是war之类(而不是默认的jar)的时候才能看出来。通过compile和provided引入的jar包,里面的类,你在项目中可以直接import进来用,编译没问题,但是runtime引入的jar包中的类,项目代码里不能直接用,用了无法通过编译,只能通过反射之类的方式来用。通过compile和runtime引入的jar包,会出现在你的项目war包里,而provided引入的jar包则不会。

传递性依赖的依赖范围受第一直接依赖和第二直接依赖的范围影响,如下表所示。
在这里插入图片描述

6、dependencyManagement依赖传递的一个问题

###父依赖中dependencyManagement管理的依赖优先级高于子项目中引入依赖的依赖。

本项目中的依赖

<parent>
        <groupId>com.test</groupId>
        <artifactId>common-parent</artifactId>
        <version>1.1.1</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.0.5</version>
        </dependency>
    </dependencies>

父依赖

<groupId>com.test</groupId>
	<artifactId>common-parent</artifactId>
	<version>1.1.1</version>
	<packaging>pom</packaging>
	<name>common-parent</name>
    <dependencyManagement>
        <dependencies>
            <dependency>
				<groupId>org.apache.poi</groupId>
				<artifactId>poi-ooxml</artifactId>
				<version>4.0.0</version>
			</dependency>
          </dependencies>
</dependencyManagement>

easyexcel中的依赖

在这里插入图片描述

本项目中excel实际引入的依赖

在这里插入图片描述

标签:传递,依赖,项目,作用域,Boot,jar,maven,provided
From: https://blog.csdn.net/daniuniuniu/article/details/136659598

相关文章

  • JavaWeb-Maven基础
    Maven是专门用于管理和构建Java项目的工具,是Apache下的一个纯Java开发的开源项目,基于项目对象模型(POM)概念。先来学习一下Maven基础,等后面学完开发框架后再学Maven高级,这次的内容如下一、概述1、简介Maven是专门用于管理和构建Java项目的工具,主要功能1)提供了一套标......
  • c语言函数传递数组名
    c语言自定义函数中可以在形参中可以使用数组名作为传递代码示例如下#include<stdio.h>floatave(floata[]){ inti; floatb; floatsum=a[0]; for(i=1;i<10;++i) sum=sum+a[i]; b=sum/10; returnb;}intmain(){ floatnum[10],average; inti; for(i=0;i......
  • Java是值传递还是引用传递?
    1、典型回答值传递(Passbyvalue)和引用传递(Passbyreference)是关于参数传递方式的两个概念值传递:将传递参数的值,复制一份到方法的参数中。换句话说,值传递的是原始数据的一个副本,而不是原始数据本身引用传递:将实际参数的引用(内存地址)传递给方法,这意味着方法内部对参数的修改......
  • java毕业设计五邑大学超市网上销售软件设计(Springboot+mysql+jdk1.8+maven3.39)
    本系统(程序+源码)带文档lw万字以上 文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着互联网技术的飞速发展,电子商务已经成为现代商业活动中不可或缺的一部分。特别是网上超市销售业务,它借助网络平台突破了传统购物的时间和空间限制,为消......
  • Android 发布aar远程依赖出现扩展方法无法找到问题
    原文:Android发布aar远程依赖出现扩展方法无法找到问题-Stars-One的杂货小窝起因最近在整合自己的工具类库,偶然发现之前写的扩展方法使用远程依赖却是提示找不到但我有个aar库却是正常的,于是看了下这两者的区别,发现是build.gradle多了下面这个导致的问题packagingOptio......
  • maven一些报错处理
    (1)Malformed\uxxxxencoding.报错解决使用everthing全局搜了resolver-status.properties文件,或者找到本地仓库的目录,删除掉这些文件。在window下可以使用这个方式,将以下改为clean.bat执行.仓库换为自己的仓库@echooffremcreatebyNettQunrem仓库路径setREPOSITORY......
  • Maven - 项目的JDK编译level是1.5,修改不掉??
    背景  idea中的maven项目,父项目和子项目的ProjectStructure的languagelevel都是1.5,怎么修改为8?尝试修改并应用后会失效,还是会自动恢复为1.5。 1、Settings中JavaCompiler中,子项目的Targetbytecodeversion都是1.52、ProjectStructure中的Module的LanguageLevel都是5......
  • Maven项目中在pom.xml中添加依赖包
    https://blog.csdn.net/qq_40768312/article/details/134314296Maven项目中在pom.xml中添加依赖包1、查找需要的依赖包例如:easypoi-base地址:https://mvnrepository.com/搜索:easypoi-base 点击第一个,查看版本,选择最新版本  2、添加依赖包复制下方红框里的内容,粘贴至pom......
  • 包含Maven和Docker的Dockerfile
    要创建一个包含Maven和Docker的Dockerfile,你需要首先明确你的需求。通常,这样的Dockerfile可能是为了构建并打包一个Java项目,然后使用Docker将其部署。以下是一个简单的示例,展示了如何创建一个Dockerfile,该Dockerfile安装了Maven和Docker,然后构建并推送一个Java项目:Dockerfile#......
  • 新版eclipse创建maven项目步骤
    eclipse版本:eclipse-jee-2023-12R一、使用eclipse自带的maven,先进行eclipse配置:1、打开Window-》preferences-》maven-》installations-》可以看到eclipse自带的maven版本,默认勾选的也是该版本(如果需要使用自行安装的maven可以在这里add);2、打开Window-》preferences-》maven-......