说明
详见:
https://www.jianshu.com/p/4b100150038b
两种配置的结果
maven依赖声明中加了 <scope>provided</scope>,或者加了<optional>true</optional>,从结果上看是一样的,都会中断依赖传递
区别
含义不同:
optional: 侧重 依赖传递。B项目依赖A项目提供了一些功能,但又不想让依赖传递给依赖B项目的项目,即:C项目依赖B项目(但不依赖A项目),如果需要依赖 A项目时,需要添加依赖配置。
如:Mybatis依赖 log4j、log4j2 等日志框架,就中断依赖传递,因为Mybatis没有日志框架,也能正常运行,只是不打印日志provided: 侧重 环境,强调只在编译时存在,而运行时不存在的依赖。也就是说,
provided的主要用途不是为了考虑 依赖是否传递,而是要看项目运行时是不是要有这个依赖
如:servlet-api这个依赖,在代码coding阶段需要使用到该依赖的api,而在实际运行时,项目是运行在tomcat中,tomcat已经包含该jar。因此编译时需要该依赖,而放到tomcat环境下运行时,不应该有这个servlet-api.jar,否则就会报错了。
参考:
https://www.jianshu.com/p/4b100150038b