Maven 中<optional>true</optional>和<scope>provided</scope>之间的区别

这篇具有很好参考价值的文章主要介绍了Maven 中<optional>true</optional>和<scope>provided</scope>之间的区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

传递依赖

依赖管理是maven提供的主要功能之一,无论我们需要什么依赖,只需将它们添加到 POM.xml 中,在构建或运行时所有必要的类和资源都会自动添加到项目的 classpath 中。

Maven 中的依赖是有传递(Transitive)性的,默认会包含传递的依赖,这样就不用手动引用每一个依赖了。比如下面这个依赖关系中,A 依赖 B,B 依赖了 C……,如果你依赖 A 的话,就会自动包含 A/B/C/D/E

 A
  ├── B
  │   └── C
  │       └── D 
  └── E
      └── D 

但是传递依赖也带来了一个问题,比如下面这个例子:

  A
  ├── B
  │   └── C
  │       └── D 2.0
  └── E
      └── D 1.0

由于传递依赖,D 2.0 和 D 1.0 都会被加入 ClassPath 中,但因为它们版本不同,很可能会有包冲突等一系列问题。解决这个依赖传递导致的冲突问题,有两种方案:

「1」 在使用者,也就是发起依赖方进行排除

<dependency>
  <groupId>group-a</groupId>
  <artifactId>artifact-a</artifactId>
  <version>1.0</version>
  <exclusions>
    <exclusion>
      <groupId>group-c</groupId>
      <artifactId>excluded-artifact</artifactId>
    </exclusion>
  </exclusions>
</dependency>

「2」 在提供方,将依赖的范围定义为不传递,这样在构建时就不会包含这些不传递的依赖包了。不传递的配置有两种方式,也是本文讨论的重点

「2.1」 定义 dependency scope 为 provided

<dependency>
  <groupId>group</groupId>
  <artifactId>artifact-d</artifactId>
  <version>2.0</version>
    <!-- 不传递 -->
  <scope>provided</scope>
</dependency>

「2.2」 定义 <optional>

<dependency>
  <groupId>group</groupId>
  <artifactId>artifact-d</artifactId>
  <version>2.0</version>
  <!-- 不传递 -->
  <optional>true</optional>
</dependency>

在添加依赖项时,我们可以使用 <optional>true</optional> 标志:

在这两种不传递配置下,依赖关系都将在声明它们的模块的 classpath 中,但是使用将它们定义为依赖关系的模块不会在其他项目中传递它们,即不会形成依赖传递。

<optional>provided scope 之间又有什么区别呢?

从语义来上理解

optional

可选的,可以理解为此功能/此依赖可选,如果不需要某项功能,可以不引用这个包。

scope provided

提供的,可以理解为此包不由我直接提供,需要调用者/容器提供。

举个例子说明二者的使用场景和区别

optional

现开发了一个类似Hibernate的框架,叫Summer吧,致敬下Spring,提供了多种数据库方言的支持:mysql/oracle/db2/postgresql…
每种数据库支持也独立了一个module,Summer的依赖中配置了每种数据库的支持包:summer-mysql-support/summer-oracle-support…

但是实际引用此框架/依赖时,并不需要所有数据库方言的支持。此时可以把数据库的支持包都配置为可选的true。
引用此框架时,只需按需引入自己需要的方言支持包即可,避免了冗余繁杂的依赖,也降低了jar包冲突的风险。

scope provided

现有一普通Web工程,必然会用到servlet-api这个包。但是实际上这个包一定是由容器提供的,因为我们这个web会部署到容器内,容器会提供servlet-api,如果此时项目中再引用的话就会造成重复引用,会有版本不一致的风险。

总结
二者从功能来看,都做到了依赖不传递。但在语义上表示不同,使用时按场景选择就好。

出自:https://segmentfault.com/a/1190000019266080?utm_source=tag-newest文章来源地址https://www.toymoban.com/news/detail-462983.html

到了这里,关于Maven 中<optional>true</optional>和<scope>provided</scope>之间的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • maven中的scope

    这个scope,就像是 写java注解时的 @Retention(xxx) 的那个感觉,大约是一种 “生命周期”的感觉。 能体会到,理解到这个意思,基本上就够了。具体只是生效到哪个阶段而已。 1、 compile :默认值,可省略不写。此值表示该依赖需要参与到项目的编译、测试以及运行周期中,打包

    2024年02月14日
    浏览(32)
  • maven的依赖范围scope使用

    标签的位置:dependencies/dependency/scope 标签的可选值:compile/test/provided/system/runtime/import #①compile 和 test 对比 main目录(空间) test目录(空间) 开发过程(时间) 部署到服务器(时间) compile 有效 有效 有效 有效 test 无效 有效 有效 无效 #②compile 和 provided 对比 main目录(空间

    2024年02月10日
    浏览(40)
  • CSS中scope和scoped区别

    在css的发展中,涌现了大量的新的特性和专有名词。 scope 是 CSS 中的一个伪类选择器,表示当前规则所在元素,它可以用于限定元素选择器的范围。在常规的 CSS 中,所有的选择器都是全局的,即它们适用于文档中的任何元素。但在某些情况下,我们需要将某个选择器限定在

    2024年02月08日
    浏览(34)
  • Vue3前端开发,provide和enject的基础练习,跨层级传递数据

    Vue3前端开发,provide和enject的基础练习,跨层级传递数据! 声明:provide虽然可以跨层级传递,但是依旧是需要由上向下的方向传递。根传子的方向。 这个是入口组件的内容,我们调用了一个中间组件Middle.vue。 这个是中间组件的内容,我们调用了一个三级组件Three.vue. 这个是第三

    2024年01月22日
    浏览(47)
  • maven optional

    optional是maven依赖jar时的一个选项,表示该依赖是可选的,不会被依赖传递。 减少不必要的依赖传递 减少jar包冲突 A项目的pom中依赖了system-local-api B项目依赖了A项目 因为maven有依赖传递机制,那么B项目就会有system-local-api的jar包,实际上在B项目中不一定要使用system-local-api,那

    2024年02月11日
    浏览(35)
  • .net通过Action进行Options参数的传递,你知道是怎么实现的吗?

    在.NET Core中,使用 Action 和 Options 参数方式配置服务并将配置信息对象注册到 IServiceCollection 的好处在于,它提供了更高级别的可配置性和可扩展性。这种模式允许将配置信息与服务的实现分离,使配置更加模块化和可管理。通过将配置信息对象注册到 IServiceCollection ,可以轻

    2024年02月05日
    浏览(41)
  • HbuilderX运行打包项目时报node.exe: --openssl-legacy-provider is not allowed in NODE_OPTIONS的解决办法

    这两天在用HbuilderX 打包项目时一直报 一直以为是版本的问题,把hbuilderx更换到 最新的正式版v3.6.4 此问题照常存在 更新到v3.6.7 ALPHA版本也照常存在此错误 最后把hbuilderx换成历史的版本同样存在此问题 后来记得原来在系统环境变量配置中经加过,系统环境变量 但现在已经删除

    2024年02月07日
    浏览(37)
  • mac远程vscode 服务器 出现 Unable to start debugging. Launch options string provided by the project system i

    Unable to start debugging. Launch options string provided by the project system is invalid. Unable to determine path to debugger.  Please specify the \\\"MIDebuggerPath\\\" option 如果您使用的是Linux系统,并且遇到了VSCode中的调试问题,提示需要指定MIDebuggerPath,这通常意味着您需要在launch.json配置文件中指定GDB或LLDB调

    2024年03月28日
    浏览(74)
  • Windows和Linux之间如何传递数据|两台Linux之间如何传递数据

    摘要:我们租用了一台服务器,然后我们想要把我们写的项目上传到自己的Linux服务器中,那么我们应该怎么上传呢?如果我们想要从服务器中下载一些资料,那么又该如何进行呢?看这篇文章将会告诉你答案。 把数据从本地电脑上传到Linux服务器的方式有很多,这里介绍最

    2024年02月03日
    浏览(41)
  • Maven项目中的依赖出现版本冲突,最终发现是对Dependency Scope理解有误

    再来个文章目录 本文记录一下遇到maven依赖版本冲突后的排查过程说明以及问题原因说明 下面还有投票,帮忙投个票👍 最近加入了 Apache Dubbo 开源社区,成为了一名Dubbo Contributor。在熟悉Dubbo中的各个RPC协议时根据官网提供的示例搭建了一个示例。在熟悉过后想看下谷歌提供

    2023年04月09日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包