工欲善其事,必先利其器之 Maven (一)

这篇具有很好参考价值的文章主要介绍了工欲善其事,必先利其器之 Maven (一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. scope 概念

maven 在引入依赖时,配置上有一个 scope 标签,例如:

<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.1.0</version>
    <scope>runtime</scope>
</dependency>

例子中的 <scope>runtime</scope> 表示运行时的依赖范围,不同的 scope 对于项目在编译,测试,打包时会产生不同的效果,了解不同类型的 scope 可以让开发者在引入依赖时更加准确,避免开发、测试以及最终打包发布时出现各种奇奇怪怪的问题。

scope 是用来规定依赖与三种 classpath 的关系的,分别是:编译 classpath,测试 classpath,运行时 classpath。

这三种 classpath 分别也对应着 maven 中主程序编译,测试用例编译、执行,主程序打包这几个流程。

设置 scope 是为了使引入的依赖在该生效的 classpath 中生效,在不该生效的 classpath 中无效。这样才能避免最终运行的程序中出现依赖冲突或者依赖缺失的情况。

2. scope 类型

依赖的 scope 的类型一共有 5 个,常用的是前 4 个,每一个 scope 的类型控制依赖会在某一个或者某几个 classpath 中生效。

  1. compile: 默认值,此类型的依赖在主程序编译,测试用例编译、运行生效,项目打包时也会打进包里(也就是运行时 classpath)
  2. test: 只在测试用例编译、执行时生效,主程序编译及项目打包时都不会生效
  3. provided: 主程序编译,测试用例编译、执行时生效,但是程序打包时不会生效,也就是不会被打进包里,因为程序运行时的环境会提供此类型的依赖,打进包里反而可能出现依赖冲突的情况
  4. runtime: 主程序编译、测试用例编译时不会生效,测试用例执行以及程序打包时会生效
  5. system: 同 provided,只不过使用时必须通过 <system-Path> 元素显式指定依赖文件路径,一般与本机强绑定,可能造成构建的不可移植,应谨慎使用。

简洁版的对应关系描述可以看下面的表格。文章来源地址https://www.toymoban.com/news/detail-625251.html

3. scope 与 classpath 关系

依赖范围(scope) 编译 classpath 有效 测试 classpath 有效 运行时 classpath 有效 例子
compile Y Y Y spring-core
test N Y N JUnit
provided Y Y N servlet-api
runtime N Y Y JDBC 驱动
system Y Y N 本地的,Maven 仓库之外的类库文件

到了这里,关于工欲善其事,必先利其器之 Maven (一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包