Maven依賴中scope的作用
Maven依賴中scope的作用
簡介
scope是依賴的一個屬性,主要用來限制依賴傳遞,並決定該依賴會不會包含到對應的類路徑中
連結
分類
-
compile
【系統預設】該scope表示這個依賴會貫穿整個應用的生命週期,比如編譯-執行-測試
-
provided
該scope表示這個依賴只在編譯和測試時會被載入,在執行時不會載入;
比如tomcat等容器類相關依賴,因為web應用都是部署在tomcat等容器中,所以程式在部署時不需要這個依賴
-
runtime
該scope表示這個依賴只在執行和測試時會載入,編譯不會載入
-
test
該scope表示這個依賴只在測試時才會載入
比如JUnit等測試依賴
-
system
【已廢棄】
-
import
該scope用在
<dependencyManagement>
標籤中,搭配<type>pom</type>
屬性一起用,表明這個依賴會被對應的pom檔案中的所有依賴替代因為pom檔案只能有一個parent(即只能繼承一個pom),但是通過import,可以匯入多個pom依賴
例子
下面用示例來說明各個scope的區別
LogTest.java
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class LogTest { static Logger log = LoggerFactory.getLogger(LogTest.class); public static void main(String[] args) { log.info("b"); } }
pom.xml
<dependencies>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.3.0-alpha5</version>
</dependency>
</dependencies>
如上所示,有一個測試類LogTest.java
和一個pom.xml
,其中pom中的依賴scope沒有顯示指定,則預設為compile
-
compile
此時編譯、執行專案都沒問題
-
provided
將
pom.xml
的依賴scope修改為provided
<dependencies> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <scope>provided</scope> <version>1.3.0-alpha5</version> </dependency> </dependencies>
此時編譯沒問題,但是執行時報錯如下,因為執行時不會去專案中載入這個依賴,而是去本地的類路徑查詢(但是本地只是Java環境,並沒有logback依賴)
PS:可以通過檢視控制檯的java執行命令,檢視具體查找了哪些路徑
java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory at LogTest.<clinit>(LogTest.java:5) Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 1 more Exception in thread "main"
-
runtime
將
pom.xml
的依賴scope修改為runtime
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <scope>runtime</scope> <version>1.3.0-alpha5</version> </dependency>
此時編譯時報錯如下,因為runtime指定的範圍就是執行以及測試才會載入,編譯不載入
Error:(1, 17) java: 程式包org.slf4j不存在 Error:(2, 17) java: 程式包org.slf4j不存在
runtime
的作用主要是讓我們在程式碼中直接依賴介面或抽象(比如 JDK的JDBC介面),然後在執行時再去依賴真正的實現(比如 mysql-connector-jar)比如MySQL驅動依賴
mysql-connector-jar
,就可以設定為runtime
,然後通過JDBC抽象層來間接的使用 -
test
- 將
pom.xml
的依賴scope修改為test
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <scope>test</scope> <version>1.3.0-alpha5</version> </dependency>
- 將上面的LogTest.java挪到test目錄
此時編譯和執行都沒問題
但是如果放在main目錄下,則編譯和執行都報錯
- 將