第五章 坐标和依赖
groupId、artifactId和version是依赖的基本坐标。type为依赖的类型,对应于项目坐标定义的packaging。scope是依赖的范围。optional标记依赖是否是可选的。exclusions用来排除传递性依赖。
Compile :编译依赖范围。对于编译、测试、运行三种classpath都有效。是默认的依赖范围。
Test :测试依赖范围。只对测试classpath有效。如Junit
Provided :已提供依赖范围。只对编译、测试classpath有效。如servlet-api,运行时容器已提供。
Runtime :运行依赖范围。只对测试和运行classpath有效。如JDBC驱动实现,编译主代码时只需要JDK提供的JDBC接口。
System :系统依赖范围。与Provided依赖范围一致。但依赖是通过systemPath元素显式指定文件的路径,与本机系统绑定,一般无法移植。
Import :导入依赖范围。不会对3种classpath产生实际影响。
scope
compile classpath
test classpath
runtime classpath
example
compile
Y
Y
Y
spring-core
test
-
Y
-
Junit
provided
Y
Y
-
servlet-api
runtime
-
Y
Y
JDBC驱动实现
system
Y
Y
-
本地的Maven类库文件
第一???????? 第二
compile
test
provided
runtime
compile
compile
-
-
runtime
test
test
-
-
test
provided
provided
-
provided
provided
runtime
runtime
-
-
runtime
疑问:为什么 compile + provided --> no dependency ? 而 provided +provided --> provided ? 个人认为此表完全不对。。。
A->B->C->X(1.0) A->D->X(2.0)? X->2.0
依赖调解第二原则:最先声明:
A->B->X(1.0) A->D->X(2.0) 且B比D先声明,X->1.0
<properties><spring.version>2.5.6</spring.version></properties>。
然后在版本信息的位置使用${spring.version}来引用它。
?
18.??可以执行mvn dependency:list或 mvn dependency:tree查看已解析的依赖(resolved dependency)。
?
19.??可以执行 mvn dependency:analyze来分析项目中的直接用到但未显示声明的依赖(Usedundeclared dependencies)和声明了但未用到的依赖(Unused declared dependencies)。Used undeclareddependencies是项目直接用到了,但通过传递依赖引入的项目,这样当项目的直接依赖更新时,传递依赖也会随之更新,从而会导致项目代码与传递依赖不兼容。Unused declared dependencies并不是完全没用的依赖,只是在编译主代码和测试代码时没用,但可能会在执行测试和运行时用到。
1 楼 huiyibuzai 2012-07-01 疑问:为什么 compile + provided --> no dependency ? 而 provided + provided --> provided ? 个人认为此表完全不对。。。