先说效果,maven依靠声明中加了<scope>provided</scope>,或者加了<optional>true</optional>,从效果上看是一样的,都会中断依靠传递,观察下图:
图中,项目B分别依靠了C和D,只不过一个声明白optional=true,一个声明白scope=provided,然后项目A再声明白B的依靠,此时在项目A情况中,既没有C,也没有D,以是在效果上看,它们是一样的。
那它们有哪些区别呢?
先看一下maven官方文档上对二者的形貌:
If project Y depends on project Z, the owner of project Y can mark project Z as an optional dependency, using the “optional” element. When project X depends on project Y, X will depend only on Y and not on Y’s optional dependency Z. The owner of project X may then explicitly add a dependency on Z, at her option. (It may be helpful to think of optional dependencies as “excluded by default.”)
This is much like compile, but indicates you expect the JDK or a container to provide the dependency at runtime. For example, when building a web application for the Java Enterprise Edition, you would set the dependency on the Servlet API and related Java EE APIs to scope provided because the web container provides those classes. A dependency with this scope is added to the classpath used for compilation and test, but not the runtime classpath. It is not transitive.
大概意思是说,在A项目依靠B项目提供了一些特性,但又不想让这些特性默认提供,而是作为可以选择的附加功能,默认不提供,须要声明后(主动添加B项目标依靠)才生效,这时用optional;而对于provided,文档侧重提到了运行情况概念,夸大只在编译时存在,而运行时不存在的依靠,也就是说,provided的主要用途不是为了考虑依靠是否传递,而是要看项目运行时是不是不应该有这个依靠(是不是须要jvm或者运行容器提供)。
常常拿scope=provided来举例的经典场景之一,就是servlet-api这个依靠了,在代码coding阶段须要使用到它的一些api,而在实际运行时,它的作用要由详细的运行容器来实现,因此编译时可以有它,而打成war包放到tomcat情况下运行时,war包内里不应该有这个servlet-api.jar,否则就会报错了。
在实际的spring-boot项目中,由于大部门使用了内置的undertow或者tomcat容器,已经不须要特别声明这个jar的provided属性了。毕竟上,日常中更常常须要被用到的,应该主要就是这个optinal了,比如你要提供一组基础jar包,供项目组中的其他同事在他们的项目中引入依靠使用时,如果你提供的某些依靠了其他jar包来做的功能并不一定会被使用到,便可以用到这个optinal了。特别是用到诸如@ConditionalOnClass这种检测项目中是否存在某个class的判断条件时,更是用optional的好机遇。
而provided的使用场景,除了servlet-api,lombok也很适合:A项目使用lombok做了一些代码天生,完成开发须要deploy到私服仓库之前,记得要将lombok的依靠加上<scope>provided</scope>,因为它的作用周期已经在A项目打包完成时结束了,对于依靠A项目标其他项目,不须要用到lombok这个玩意儿,它们须要的是A项目提供的功能,而不是附带的帮助自己天生代码的额外功能;也不应该用optional,因为没什么好选择的,它并不是A项目提供的可选功能之一。
(END)
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |