maven的依赖可以分为多个scope类型,具体如下:
1.Compile
默认的配置。这个jar是会有依赖关系的,而且在打包的时候也会包含依赖jar。
2.Provided
此范围用于标记JDK或容器在运行时应该提供的依赖项。所提供的依赖关系只在编译时和项目的测试类路径中可用;而且它们不是传递的。打包时候不会包含依赖jar。
3.Runtime
运行时的依赖jar,在编译时和在运行时会打包,依赖会传递。
4.Test
此范围用于表示在应用程序的标准运行时不需要此依赖关系,但仅用于测试目的。依赖关系不是可传递的,只出现在测试中。
5.System
此属性与所Provided非常相似。这两个scope的主要区别在于,System要求我们直接指向系统上特定的jar。
此属性可以使我们引入第三方的jar(此jar不在maven仓库中,例如一些第三方接口提供的jar)。
注意:
如果指向的jar不存在或者由于不同系统的路径表达不同导致找不到jar,则此属性的依赖会失败。
6.Import
它只对依赖类型pom可用。
例如:
com.baeldung
custom-project
1.3.2
pom
import
eg:
那么A实际依赖的将会是D2。
这点在项目中可以用来解决依赖冲突的情况。假如在项目中有依赖的jar包含了冲突的jar,那么可以在依赖jar所在的pom文件中手动排除依赖,然后在添加需要的依赖。
类似以上的例子,可以在A所在的pom中手动排除D2,然后在添加D1到pom文件中,这样的就近原则就使A->D1。
下面一个是工作中实际碰到的例子:由于在此pom中,其他的依赖jar导致了jackson-databind自动依赖了低版本的jackson-annotations和jackson-core。所以在调试的测试的时候,发生报错,然后通过手动排除,在此pom中手动添加的方式,可以依赖高版本的jar。
com.fasterxml.jackson.core
jackson-databind
2.9.6
com.fasterxml.jackson.core
jackson-annotations
com.fasterxml.jackson.core
jackson-core
com.fasterxml.jackson.core
jackson-annotations
2.9.6
com.fasterxml.jackson.core
jackson-core
2.9.6
出现这个问题,排查的几个方向:
1.机器真的是ping不通仓库
2.本地仓库中下载了不完整的jar。这种情况几率比较高
仓库中已经下载了相应版本的jar,但是不完整,有lastUpdated后缀的文件。这时候,需要把对应的目录删除(主要删除 lastUpdated文件),然后重新下载,基本可以解决问题。
以上是使用maven的一点心得体会,欢迎大神拍砖。
参考:
Maven依赖管理:控制依赖的传递:https://ijiangtao.github.io/2018/03/10/java/maven/MavenDependencyMechanism/
Maven Dependency Scopes :https://www.baeldung.com/maven-dependency-scopes