2011-05-09 81 views
31

我在我的POM中有一個依賴關係,需要將其設置爲「提供」,所以它不包含在編譯中,但仍可以在我的項目中引用它。當我去運行測試時,我希望相同的依賴關係具有「測試」範圍,所以我不必手動將jar添加到我的類路徑中。有沒有辦法做到這一點或取得類似的結果?POM中的多個依賴範圍

這樣做的原因是我的JBOSS庫目錄中有一些常見的jar包,所以我想要使用這些jar包,併爲構建的戰爭保留它們的「提供」範圍。但是,當我從命令行運行JUnits時,我想從存儲庫使用該jar,而無需手動將其添加到我的類路徑中。

由於提前

+0

你使用surefire插件來運行單元測試嗎? – 2011-05-10 14:45:06

+0

請澄清你是否參考階段或不同的版本與「編譯」和「去運行測試」(請參閱​​我的答案和下面的評論)。 – Jan 2011-05-12 07:44:11

回答

28

maven documentation

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

我在maven 3.0.3中檢查了這個作品。有同樣的問題,我需要編譯和測試時,有一個servlet依賴項,但沒有編譯,因爲它隨應用程序服務器分發。

+0

這是正確的答案,至少在我的用例中。 @Steve,你應該把它標記爲接受:) – 2012-11-16 21:10:12

6

你可以使用一個配置文件,要麼宣稱這些依賴作爲測試或提供 - 這取決於對你來說是更方便:

<profiles> 
    <profile> 
     <id>whatever</id> 
     <activation> 
      <property> 
       <name>env</name> 
       <value>whatever</value> 
      </property> 
     </activation> 
     <dependencies> 
      <dependency> 
       <groupId>yours</groupId> 
       <artifactId>yours</artifactId> 
       <scope>provided</scope> 
      </dependency> 
     </dependencies> 
    </profile> 
    <profile> 
     <id>test</id> 
     <activation> 
      <property> 
       <name>env</name> 
       <value>test</value> 
      </property> 
     </activation> 
     <dependencies> 
      <dependency> 
       <groupId>yours</groupId> 
       <artifactId>yours</artifactId> 
       <scope>test</scope> 
      </dependency> 
     </dependencies> 
    </profile> 
</profiles> 

這些配置文件只需設置激活財產env但也有其他方法,fe默認激活 - 看看here

+0

我認爲OP想要在_same_構建中提供並測試範圍。 – 2011-05-11 08:19:33

+0

@安德魯斯賓塞:我認爲公正的用例不同,除了他指的是同一個構建中的測試。這當然會是另一回事...... – Jan 2011-05-12 07:42:59

+0

這不是Maven的方式!依賴關係應該是穩定的,哪些配置文件是主動的! – 2013-08-14 06:30:45

3

嘗試聲明兩次依賴關係,每個作用域一次。適用於Maven 2.2.1。

令人困惑的事情發生在依賴解決方案,當相同的工件在依賴關係樹中兩次與不同的範圍,但我不認爲它應該是一個問題在你的情況。

+2

在Maven 3.0.5中,這個解決方案導致'[警告]強烈建議解決這些問題,因爲它們威脅到構建的穩定性。因此,未來的Maven版本可能不再支持構建此類格式不正確的項目。「 – SebastianH 2014-02-18 16:19:18

0

使用maven-surefire插件來運行你的junit測試。提供的範圍也將使其在測試類路徑中可用。

2

有同樣的問題,爲什麼我需要兩個範圍相同的依賴項是階段集成測試我使用jetty插件運行休息服務,並做一些JUnit測試,而碼頭正在運行,但我編譯我的軟件包作爲jboss,我已經有了「resteasy-cdi」,比jetty servlet容器缺少了...我還沒有找到解決方案。

0

請找出範圍的確切含義在Maven的

我refered到Maven http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

依賴範圍用來限制依賴的傳遞,同時也影響到用於各種建設任務的類路徑。

有6米範圍內有效:

編譯: -

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

提供: -

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

運行時: -

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

測試: -

此範圍表明,依賴並不需要正常使用的應用程序,並且僅適用於測試編譯和執行階段。

系統: -

此範圍類似,但你必須提供包含它明確的JAR提供。工件始終可用,並且不會在存儲庫中查找。導入(僅在Maven 2.0.9或更高版本中可用): - 此範圍僅用於部分中的類型pom依賴項。它表明指定的POM應該替換爲該POM部分中的依賴關係。由於它們被替換,因此具有導入範圍的依賴關係實際上並不參與限制依賴關係的傳遞性。