Maven 中optional.true和scope.provided之间的区别

2022-06-28 19:47:39 浏览数 (1)

本文最后更新于 888 天前,其中的信息可能已经有所发展或是发生改变。

1. 介绍

在添加依赖项时,我们可以使用optional标志,或将scope设置为“provided”。在这两种情况下,依赖关系都将在声明它们的模块的classpath中,但是使用将它们定义为依赖关系的模块不会在其他项目中传递它们,即不会形成依赖传递。

2.从语义来上理解

  • optional 可选的,可以理解为此功能/此依赖可选,如果不需要某项功能,可以不引用这个包。
  • scope provided 提供的,可以理解为此包不由我直接提供,需要调用者/容器提供。

3. 场景和区别

  • 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,如果此时项目中再引用的话就会造成重复引用,会有版本不一致的风险。

Post Views: 509

0 人点赞