Maven 中<optional>true</optional>和<scope>provided</scope>之间的区别(转)
原文:https://segmentfault.com/a/1190000019266080?utm_source=tag-newest
<optional>true</optional>和<scope>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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具