maven pom进阶教程 - dependency

dependency功能大幅度的简化了对第三方库的管理。若是须要将某个库升级到最新版本,只须要更改一下版本号。java

传递性transitive

先看定义tomcat

可传递  若是A依赖B, B依赖C, 那么A也将依赖Cbash

不可传递  A依赖B, B依赖C,  可是A不依赖Cmaven

第三方库,或者本身编写的java库,并非每一个功能都是彻底重写一遍,仍是有可能调用其它的一些开源库。这时就涉及到了依赖的传递性,它跟scope有关,见一下节。ide

查看项目的依赖关系, 可使用命令测试

mvn dependency:tree

scope

限定在哪些状况下使用这个依赖库。spa

scope有五个值:插件

  • compile, 默认值, 在mvn的编译/运行/测试/打包过程当中, 都会将依赖加入到classpath, 在war包package过程当中, 默认状况下会将依赖的库导入到war包的lib中。 compile类型的依赖是可传递的.
  • provided,只在编译和测试阶段,将依赖加入到classpath, 在运行和打包时, 会忽略它们. 在运行时,须要jdk或是容器(例如tomcat, jetty)来提供这部分库 . provided类型的依赖不可传递。
  • runtime,只是在运行和测试时, 才将依赖加到classpath. 好比, 经过配置文件/依赖注入/反射机制调用所依赖的库时, 可使用runtime, 由于代码里没有直接引用依赖, 所以编译时不须要连接所依赖的库. runtime类型依赖是可传递的.
  • test ,只是在测试阶段使用, 不可传递
  • system, 相似于provided, 可是maven不会在仓库中搜索依赖, 而是须要使用systemPath(绝对路径)来指定搜索的目录. system类型依赖是可传递的.

若是嫌麻烦,能够不指定scope, 默认使用compile, 可是会致使生成的目标文件包含没必要要的库。code

另外, 部分插件可使用scope过滤某些依赖。xml

dependencyManagement

能够将dependency的详细信息,包含version, scope定义在parent的pom.xml的dependencyManagement中, 而child的dependency只须要指定groupId和artifactId。此时version和scope将继承parent中的dependencyManagement对应的依赖项的值。至关于,由parent定义,而后由child引用。

相关文章
相关标签/搜索