2013-10-23 60 views
9

在pom.xml中,我們將提供編譯時和運行時作爲依賴中的作用域?那有什麼意義呢?請提供一些適用於理解的例子。maven編譯時和運行時之間的區別

+0

一種是隻在編譯期間需要庫時,一種是在運行時需要庫時需要庫。 –

回答

1

想象一下,您正在將應用程序部署到Java EE compiant服務器。服務器提供實現Java EE標準的所有Lilbraries,所以您不需要將它們部署到您的應用程序中。

在開發過程中,您將需要Java EE庫與編譯時間範圍,因爲你需要編譯的類。

但是,在運行時期間,依賴關係由應用程序服務器提供。 Maven使用'提供'範圍來處理這種情況。

15

以下是從maven documentation

採取編譯

這是默認範圍,如果沒有指定使用。編譯依賴關係在項目的所有類路徑中都可用。而且,這些依賴關係會傳播到依賴項目。

運行

此範圍表明依賴不需要編譯,而是執行。它在運行時和測試類路徑中,但不在編譯類路徑中。

因此,舉例來說,如果我們有以下兩個依賴於我們的POM:

<dependency> 
    <groupId>commons-logging</groupId> 
    <artifactId>commons-logging-api</artifactId> 
    <version>1.1.3</version> 
    <scope>compile</scope> <!-- can be ommitted as it is the default --> 
</dependency> 
<dependency> 
    <groupId>commons-logging</groupId> 
    <artifactId>commons-logging</artifactId> 
    <version>1.1.3</version> 
    <scope>runtime</scope> 
</dependency> 

然後從commons-logging-api類將是對我的模塊的編譯過程中的類路徑,而從commons-logging類不會可用 - 如果意外,我在我的項目類中有一個直接引用commons-logging中的類,那麼構建會失敗。

但是,在執行運行時或測試編譯&時,來自commons-logging的類將位於classpath中,因此可以使用(即通過commons-logging-api中的類或直接在項目的測試中使用)。

compileruntime這兩個依賴項都包含在Maven中,當您的項目被引用爲另一個項目中的依賴項時,它們是可傳遞地(在同一範圍內)包含的。

p.s.正如kostja提到這裏也是provided範圍

提供

這很像編譯,而是指你所期望的JDK或容器,以提供在運行時的依賴。例如,在爲Java Enterprise Edition構建Web應用程序時,您可以將Servlet API和相關Java EE API的依賴性設置爲範圍,因爲Web容器提供了這些類。此範圍僅在編譯和測試類路徑中可用,且不是傳遞性的。

基本上providedcompile之間的區別是,provided依賴關係是不傳遞的。

相關問題