当前位置: 首页 > 科技观察

Maven依赖的作用域你到底用对了没有

时间:2023-03-12 00:45:05 科技观察

您是否正确使用了Maven依赖项的范围?导致这样那样的问题。今天胖哥就给大家讲解一下Maven引用dependencies-scope的一个关键概念。选择正确的作用域scope是Maven坐标的一个关键字,主要是限制依赖的范围。它有五种类型:Maven依赖范围选择一个合理的范围来避免一些依赖引用问题。compile这是我们大多数情况下使用的引用范围。也是Maven默认的作用域值,表示该依赖会参与Java代码的编译、测试和运行。runtime运行时,顾名思义,只参与runtime,跳过编译阶段。当然是fatjar的时候会像compile一样打包。比如我们常用的数据库驱动,你可以去看看你的SpringBoot项目生成器是否初始化了数据库驱动依赖runtime。相信使用providedprovided的同学不会太多。用来声明你想让JDK和containerruntime提供它,你自己不引入,只用这个依赖,在一些通用规范和插件扩展中比较常用这个选项。比如你想让servlet容器提供servletAPI,同时又想调用HttpServletRequest等API,可以使用provided来声明。它也有一个场景。比如你为某个类库A开发了一个扩展类库B,你必须在扩展类库B中引用A,如果不使用provided,当你开发完扩展类库B时,可以使用直接引用B的完整功能;如果使用provided,需要同时引用A和B。你为什么要这样做?这样做可以使扩展类库更加纯粹,只提供扩展功能,不干扰主类库的功能,完全插件化。系统感觉与提供的正好相反。提供是要求别人提供;而系统不是别人提供的,Maven不会去本地仓库查找。大多数使用该系统的系统都没有托管在Maven中央仓库和私有仓库中。另外provided不会打包,只是声明调用关系,系统会打包。胖哥只推荐在测试一些第三方私有jar时使用。如果选择了jar,还是建议放在私有仓库中。system我个人不推荐在生产中使用它。optionaloptional不是范围的选项,而是一个关键字,其选项为布尔值true和false。之所以要在这里讲,是因为它也可以控制依赖的范围,只是它的场景和上面的不一样。用于声明一个依赖是否可选,不向上传递。举个例子,胖哥开发了一个类库,用的是lombok。但是很多开发者对lombok非常反感,看到胖哥在这个类库中使用了lombok就不需要了。为了推广,胖哥必须想办法照顾这部分人,所以让lombok的optional值设置为true。这样既不会耽误胖哥库中lombok注解的使用,也不会影响使用胖哥库的开发者。你可以看看SpringBootStarter,它使用了很多可选的。注意与提供的区别。provided表示我必须使用这个库,但是我不提供这个库;optional表示我也用这个库,但是我不会让你用。总结在开发过程中不能忽略依赖范围。选择一个合理的范围可以让你的项目的依赖更加合理和“干净”。看完这篇文章,赶快看看你的项目的依赖引用是否合理。