2012-08-14 38 views
15

當使用maven-surefire-plugin並且包含和排除時,它們處理的是哪些訂單?此外,如果您有三組測試,第一組爲基礎組,第二組和第三組爲特殊情況,您是否可以使用配置文件進一步包含/排除?如何將配置文件包含/排除設置合併?例如,我願做這樣的事情:maven-surefire-plugin包含/排除優先

<build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.12.2</version> 
     <configuration> 
      <excludes> 
      <exclude>/org/mycompany/dataset/test/ExtractProd*.java</exclude> <!-- requires special network connectivity --> 
      <exclude>/org/mycompany/dataset/test/LargeDataset*.java</exclude> <!-- requires lengthy processing --> 
      </excludes> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 

    <profiles> 
    <profile> 
     <id>connectedToProdNetwork</id> 
     <build> 
     <plugins> 
      <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <configuration> 
       <includes> 
       <include>/org/mycompany/dataset/test/ExtractProd*.java</include> 
       </includes> 
      </configuration> 
      </plugin> 
     </plugins> 
     </build> 
    </profile> 
    <profile> 
     <id>runForAsLongAsYouNeed</id> 
     <build> 
     <plugins> 
      <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <configuration> 
       <includes> 
       <include>/org/mycompany/dataset/test/LargeDataset*.java</include> 
       </includes> 
      </configuration> 
      </plugin> 
     </plugins> 
     </build> 
    </profile> 
    </profiles> 

,然後可以這樣運行:

mvn package -P connectedToProdNetwork 

mvn package -P runForAsLongAsYouNeed 

mvn package -P connectedToProdNetwork,runForAsLongAsYouNeed 

---- UPDATE -----

使用mvn help:effective-pom -P [profileA]我能夠確定的是,如果我指定一個配置文件,所產生的有效POM將是:

 <configuration> 
      <includes> 
      <include>[includeFromProfileA]</include> 
      </includes> 
      <excludes> 
      <exclude>/org/mycompany/dataset/test/ExtractProd*.java</exclude> <!-- requires special network connectivity --> 
      <exclude>/org/mycompany/dataset/test/LargeDataset*.java</exclude> <!-- requires lengthy processing --> 
      </excludes> 
     </configuration> 

如果我提供多個配置文件,mvn help:effective-pom -P [profileA],[profileB]

 <configuration> 
      <includes> 
      <include>[includeFromProfileAOrBSeeminglyArbitraryChoice]</include> 
      </includes> 
      <excludes> 
      <exclude>/org/mycompany/dataset/test/ExtractProd*.java</exclude> <!-- requires special network connectivity --> 
      <exclude>/org/mycompany/dataset/test/LargeDataset*.java</exclude> <!-- requires lengthy processing --> 
      </excludes> 
     </configuration> 

最後,如果我將屬性combine.children="append"添加到配置文件配置的<includes>元素,並提供這兩個配置文件,mvn help:effective-pom -P [profileA],[profileB]

 <configuration> 
      <includes combine.children="append"> 
      <include>[includeFromProfileA]</include> 
      <include>[includeFromProfileB]</include> 
      </includes> 
      <excludes> 
      <exclude>/org/mycompany/dataset/test/ExtractProd*.java</exclude> <!-- requires special network connectivity --> 
      <exclude>/org/mycompany/dataset/test/LargeDataset*.java</exclude> <!-- requires lengthy processing --> 
      </excludes> 
     </configuration> 

然而,現在每個文件被指定爲既是<include><exclude>,會發生什麼?

----更新2 ----

實際運行與此配置的構建:

<configuration> 
    <includes> 
    <include>**/TestA.java</include> 
    </includes> 
    <excludes> 
    <exclude>**/TestA.java</exclude> 
    </excludes> 
</configuration> 

是否運行種皮,因此纔出現了<exclude>會壓倒<include>請注意,爲了完整起見,我確實顛倒了訂單並在<includes>之前放置了<excludes>,但行爲並未發生變化。如果任何人可以找到的地方短的源代碼行爲概述,我會很樂意給他們的答案...

+3

排除覆蓋包括因爲通常人們包括比他們需要的更大的集合,只需要一些取出。這通常使得列表更短,工作更少。 – Steven 2012-08-14 23:28:28

+0

@Steven,是的,它符合我在測試過程中的經歷。你知道在哪裏這是_officially_陳述,以便我知道他們不會在未來改變這種行爲?無論如何,謝謝你。 – Lucas 2012-08-16 16:57:19

+0

我認爲實驗方法往往是最好的確定:) - 仍然:pom參考給出了關於順序的一些提示:http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle .html - 例如。繼承執行首先運行。插件使用排除/包含按照pom的順序通常很常見。所以你可以包括一些特殊的東西,但不包括全部或包含所有東西,並排除特殊的東西有疑問的命令將遵循(在大多數情況下,插件) – wemu 2015-02-03 12:40:11

回答

4

我找不到關於surefire插件的官方文檔,但確實exclude-override-include是一種常用的方法,Maven也在其他類似的上下文中應用,如資源。

的相關信息(我發現)來自官方的Maven POM參考文檔的唯一官方,here

包括:一組文件模式,其指定的文件,包括在根據該資源指定的目錄,使用*作爲通配符。

不包括:與包含結構相同,但指定要忽略的文件。 在包含和排除之間的衝突中,排除勝利

注:我在有趣的聲明中添加了最終的粗體格式。

因此,在官方的maven插件中可能會使用相同的方法(一般來說,所有插件的org.apache.maven.plugins groupId和maven-前綴都是artifactId)。

+1

偉大的發現...不知道我應該將它標記爲答案,因爲它不是技術上確定的,但絕對_userful_信息。 – Lucas 2015-11-29 19:28:08