Maven-POM中的各種scope的行為總結

dxer0730發表於2018-05-16
  • compile:預設的scope。任何定義在compile scope下的依賴將會在所有的class paths下可用。maven工程會將其打包到最終的artifact中。如果你構建一個WAR型別的artifact,那麼在compile scope下引用的JAR檔案將會被整合到WAR檔案內。
  • provided:這個scope假定對應的依賴會由執行這個應用的JDK或者容器來提供。最好的例子就是servlet API。任何在provided scope下定義的依賴在構建時的類路徑裡是可用的,但是不會被打包到最終的artifact中。如果是一個WAR的檔案,servlet API在構建時的類路徑裡是可用的,但是並不會被打包到WAR檔案中。
  • runtime:在runtime scope下定義的依賴只會在執行期可用,而在構建期的類路徑下不可用。這些依賴將會被打包到最終的artifact中。比如你有一個基於web的應用需要在執行時訪問MySQL資料庫。你的程式碼沒有任何MySQL資料庫驅動的硬依賴。你的程式碼僅僅是基於JDBC API來編寫,在構建期並不需要MySQL資料庫驅動。然而,在執行期,就需要相應的驅動來操作MySQL資料庫了。因此,這個驅動應該被打包到最終的artifact中。
  • test:只用於測試變異的依賴(比如JUnit),execution必須定義在test scope下。這些依賴不會被打包到最終的artifact中。
  • system:於provided scope很像。唯一的區別在於,在system scope中,你需要告訴Maven如何去找到這個依賴。如果你要引用的依賴在Maven倉庫中不存在時,就可以用這個scope。不推薦使用system依賴。
  • import:從其它的pom檔案中匯入依賴設定。

相關文章