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

栏目: Java · 发布时间: 7年前

内容简介:依赖管理是maven提供的主要功能之一。无论我们需要什么依赖,我们只需将它们添加到POM.xml中。由于maven,所有必要的类和资源都会自动添加到项目的classpath中。在添加依赖项时,我们可以使用optional标志,或将scope设置为“provided”。在这两种情况下,依赖关系都将在声明它们的模块的classpath中,但是使用将它们定义为依赖关系的模块不会在其他项目中传递它们,即不会形成依赖传递。可选的,可以理解为此功能/此依赖可选,如果不需要某项功能,可以不引用这个包。

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

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

从语义来上理解

optional

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

scope provided

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

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

optional

现开发了一个类似Hibernate的框架,叫Summer吧,致敬下Spring,提供了多种数据库方言的支持:mysql/oracle/db2/postgresql...

每种数据库支持也独立了一个module,Summer的依赖中配置了每种数据库的支持包:summer-mysql-support/summer-oracle-support...

但是实际引用此框架/依赖时,并不需要所有数据库方言的支持。此时可以把数据库的支持包都配置为可选的 <optional>true</optional>

引用此框架时,只需按需引入自己需要的方言支持包即可,避免了冗余繁杂的依赖,也降低了jar包冲突的风险。

scope provided

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

总结

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

参考


以上所述就是小编给大家介绍的《Maven 中trueprovided之间的区别》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

破茧成蝶:用户体验设计师的成长之路

破茧成蝶:用户体验设计师的成长之路

刘津、李月 / 人民邮电出版社 / 2014-7 / 69.00

市面上已经有很多专业的用户体验书籍,但解决用户体验设计师在职场中遇到的众多现实问题的图书并不多见。本书从用户体验设计师的角度出发,系统地介绍了其职业生涯中的学习方法、思维方式、工作流程等,覆盖了用户体验设计基础知识、设计师的角色和职业困惑、工作流程、需求分析、设计规划和设计标准、项目跟进和成果检验、设计师职业修养以及需要具备的意识等,力图帮助设计师解决在项目中遇到的一些常见问题,找到自己的职业成长......一起来看看 《破茧成蝶:用户体验设计师的成长之路》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

html转js在线工具
html转js在线工具

html转js在线工具