Maven : provided、 compile、import
scope=compile(預設)
對於scope=compile的情況(預設scope),也就是說這個專案在編譯,測試,執行階段都需要這個jar包在classpath中。
當我們用maven install生成最終的構件包ProjectABC.war後,在其下的WEB-INF/lib中,會包含我們被標註為scope=compile的構件的jar包,而不會包含我們被標註為scope=provided的構件的jar包。這也避免了此類構件當部署到目標容器後產生包依賴衝突。
scope=provided
scope=provided的情況,則可以認為這個provided是目標容器已經provide這個jar。換句話說,它隻影響到編譯,測試階段。在編譯測試階段,我們需要這個app對應的jar包在classpath中,而在執行階段,假定目標的容器(比如我們這裡的tomcat容器)已經提供了這個jar包,所以無需我們打包對應的jar包了。在執行階段,app可以直接使用容器提供的jar。
scope的其他引數如下:
compile
預設的scope,表示 dependency 都可以在生命週期中使用。而且,這些dependencies 會傳遞到依賴的專案中。適用於所有階段,會隨著專案一起釋出
provided
跟compile相似,但是表明了dependency 由JDK或者容器提供,例如Servlet AP和一些Java EE APIs。這個scope 只能作用在編譯和測試時,同時沒有傳遞性。???
runtime
表示dependency不作用在編譯時,但會作用在執行和測試時,如JDBC驅動,適用執行和測試階段。
test
表示dependency作用在測試時,不作用在執行時。 只在測試時使用,用於編譯和執行測試程式碼。不會隨專案釋出。
system
跟provided 相似,但是在系統中要以外部JAR包的形式提供,maven不會在repository查詢它
scope=import
解決maven繼承(單)問題
我們知道Maven的繼承和Java的繼承一樣,是無法實現多重繼承的,如果10個、20個甚至更多模組繼承自同一個模組,那麼按照我們之前的做法,這個父模組的dependencyManagement會包含大量的依賴。如果你想把這些依賴分類以更清晰的管理,那就不可能了。
import scope依賴能解決這個問題。你可以把dependencyManagement放到單獨的專門用來管理依賴的pom中,然後在需要使用依賴的模組中通過import scope依賴,就可以引入dependencyManagement。例如可以寫這樣一個用於依賴管理的pom:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<!-- <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> lookup parent from repository
</parent> -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.4.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>26.0-jre</version>
</dependency>
</dependencies>