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引用。

相關文章
相關標籤/搜索