1. 程式人生 > >Maven : provided、 compile、import

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>