1.Maven中的依賴作用范圍概述
Maven中使用 scope
來指定當(dāng)前包的依賴范圍和依賴的傳遞性。常見的可選值有:compile, provided, runtime, test, system 等。scope
主要是用在 pom.xml
文件中的依賴定義部分,例如:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>3.2.1.RELEASE</version>
<scope>test</scope>
</dependency>
2.scope各種取值詳解
scope取值 | 有效范圍(compile, runtime, test) | 依賴傳遞 | 例子 |
---|---|---|---|
compile | all | 是 | spring-core |
provided | compile, test | 否 | servlet-api |
runtime | runtime, test | 是 | JDBC驅(qū)動(dòng) |
test | test | 否 | JUnit |
system | compile, test | 是 |
正如上表所示,
compile :為默認(rèn)的依賴作用范圍。如果在定義依賴關(guān)系的時(shí)候,沒有明確指定依賴作用范圍的話,則默認(rèn)采用該依賴作用范圍。此種依賴,在編譯、運(yùn)行、測試時(shí)均有效。
provided :在編譯、測試時(shí)有效,但是在運(yùn)行時(shí)無效。例如:servlet-api.jar
,編譯時(shí)需要繼承HttpServlet
,自然需要引入該jar包,但運(yùn)行項(xiàng)目時(shí),Servlet容器即Tomcat已經(jīng)提供該jar包,就不需要Maven重復(fù)地引入一遍了
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
runtime :在運(yùn)行、測試時(shí)有效,但是在編譯代碼時(shí)無效。例如:JDBC驅(qū)動(dòng)實(shí)現(xiàn)mysql-connector-java.jar
,項(xiàng)目代碼編譯只需要JDK提供的JDBC接口,即java.sql.xx
包,只有在測試或運(yùn)行項(xiàng)目時(shí)才需要實(shí)現(xiàn)上述接口的具體JDBC驅(qū)動(dòng)即com.mysql.jdbc.Driver
。
<!-- 因?yàn)樵诖a編譯期可能需要使用JDBC API(例如:重寫數(shù)據(jù)源連接方式),所以作用域設(shè)置為provided ,
而在運(yùn)行的時(shí)候才需要JDBC的驅(qū)動(dòng)才可以。所以下面的數(shù)據(jù)庫連接作用域一般都設(shè)置為runtime-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<scope>provided</scope>
</dependency>
<!-- 數(shù)據(jù)庫連接驅(qū)動(dòng)-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
test :只在測試時(shí)有效,例如:JUnit。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
system :在編譯、測試時(shí)有效,但是在運(yùn)行時(shí)無效。和provided的區(qū)別是,使用system范圍的依賴時(shí)必須通過systemPath元素顯式地指定依賴文件的路徑。由于此類依賴不是通過Maven倉庫解析的,而且往往與本機(jī)系統(tǒng)綁定,可能造成構(gòu)建的不可移植,因此應(yīng)該謹(jǐn)慎使用。systemPath元素可以引用環(huán)境變量。例如:
<dependency>
<groupId>javax.sql</groupId>
<artifactId>jdbc-stdext</artifactId>
<version>2.0</version>
<scope>system</scope>
<systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>