1. 程式人生 > 其它 >Maven依賴中scope的作用

Maven依賴中scope的作用

Maven依賴中scope的作用

簡介

scope是依賴的一個屬性,主要用來限制依賴傳遞,並決定該依賴會不會包含到對應的類路徑中

連結

maven官網

分類

  • 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

    1. pom.xml的依賴scope修改為test
    <dependency>
         <groupId>ch.qos.logback</groupId>
         <artifactId>logback-classic</artifactId>
         <scope>test</scope>
         <version>1.3.0-alpha5</version>
    </dependency>
    
    1. 將上面的LogTest.java挪到test目錄

    此時編譯執行都沒問題

    但是如果放在main目錄下,則編譯執行都報錯