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

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

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常用的scope有compile,provided,runtime,test。

 

1、complie是默认值,表示在build,test,runtime阶段的classpath下都有依赖关系。

2、test表示只在test阶段有依赖关系,例如junit。

3、provided表示在build,test阶段都有依赖,在runtime时并不输出依赖关系而是由容器提供,例如web war包都不包括servlet-api.jar,而是由tomcat等容器来提供。

4、runtime表示在构建编译阶段不需要,只在test和runtime需要。这种主要是指代码里并没有直接引用而是根据配置在运行时动态加载并实例化的情况。虽然用runtime的地方改成compile也不会出大问题,但是runtime的好处是可以避免在程序里意外地直接引用到原本应该动态加载的包。例如JDBC连接池。

 

总结

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

posted @ 2020-07-24 11:13  路要一步一步走  阅读(784)  评论(0)    收藏  举报