2015-12-03 52 views
1

我有有多個配置文件的maven pom.xml文件正好有兩個中的一個配置文件:我的個人資料-Dp1激活P1,P2,P5有時一個或多個Maven的激活每次

<profiles> 
    <profile> 
    <id>p1</id> 
    </profile> 
    <profile><id>p2</id></profile> 
    <profile><id>p3</id></profile> 
    <profile><id>p4</id></profile> 
    <profile><id>p5</id></profile> 
</profiles> 

, p5或類似的。但我希望p3和p4中的任何一個始終處於活動狀態。默認情況下,它應該始終爲p3。如果我指定-Dp4,則p3應該變爲非活動狀態。

理想情況下,如果我指定-Dp3,p4,maven應該拋出一個錯誤,但這不是必需的。

任何想法如何做到這一點?

+0

這些配置文件真的有必要嗎?他們有什麼目的? – khmarbaise

+0

回頭看這個問題,你解決了這個問題嗎?答案有幫助嗎? –

回答

0

首先,您不通過-D選項激活配置文件,而是通過命令行通過-P選項激活配置文件。或者,您可以通過配置文件部分的activation元素來激活配置文件,默認情況下它會將其設置爲活動狀態,或者如果配置文件是通過activeProfiles部分在settings.xml中定義的。

如果您指定不必要的配置文件,Maven不會拋出錯誤。

所以,如果你想用默認啓動配置文件3,你可以將其設置爲在其profile節以下內容:

 <activation> 
      <activeByDefault>true</activeByDefault> 
     </activation> 

如果再要SWITH上的個人資料和關閉,使用!或者在命令行中,例如像在配置文件名前-符號:

mvn clean install -Pp3!p4 

這將激活P3輪廓和停用P4輪廓。

請注意,!字符是bash中的一個特殊字符,因此您應該將其包裝在單引號內。

但是,請注意,從命令行激活配置文件將會停用您的POM中默認激活的配置文件,但不會啓用默認情況下作爲settings.xml的一部分激活的配置文件(但所有Maven都將共享該配置文件建立在該機器上)。

從Maven的官方文件約profiles

此配置文件會自動被激活所有構建除非在相同POM另一輪廓激活使用先前描述的方法之一。當命令行中激活POM中的配置文件或通過其激活配置時,所有默認激活的配置文件將自動停用。

您可以用下面的POM樣品發揮一下配置文件激活:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.sample</groupId> 
    <artifactId>profiles-sample</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 

    <profiles> 
     <profile> 
      <id>p1</id> 
      <activation> 
       <activeByDefault>true</activeByDefault> 
      </activation> 
      <build> 
       <plugins> 
        <plugin> 
         <groupId>org.apache.maven.plugins</groupId> 
         <artifactId>maven-antrun-plugin</artifactId> 
         <version>1.5</version> 
         <executions> 
          <execution> 
           <id>p1</id> 
           <phase>package</phase> 
           <goals> 
            <goal>run</goal> 
           </goals> 
           <configuration> 
            <target> 
             <echo message="hello from p1" /> 
            </target> 
           </configuration> 
          </execution> 
         </executions> 
        </plugin> 
       </plugins> 
      </build> 
     </profile> 
     <profile> 
      <id>p2</id> 
      <build> 
       <plugins> 
        <plugin> 
         <groupId>org.apache.maven.plugins</groupId> 
         <artifactId>maven-antrun-plugin</artifactId> 
         <version>1.5</version> 
         <executions> 
          <execution> 
           <id>p2</id> 
           <phase>package</phase> 
           <goals> 
            <goal>run</goal> 
           </goals> 
           <configuration> 
            <target> 
             <echo message="hello from p2" /> 
            </target> 
           </configuration> 
          </execution> 
         </executions> 
        </plugin> 
       </plugins> 
      </build> 
     </profile> 
     <profile> 
      <id>p3</id> 
      <build> 
       <plugins> 
        <plugin> 
         <groupId>org.apache.maven.plugins</groupId> 
         <artifactId>maven-antrun-plugin</artifactId> 
         <version>1.5</version> 
         <executions> 
          <execution> 
           <id>p3</id> 
           <phase>package</phase> 
           <goals> 
            <goal>run</goal> 
           </goals> 
           <configuration> 
            <target> 
             <echo message="hello from p3" /> 
            </target> 
           </configuration> 
          </execution> 
         </executions> 
        </plugin> 
       </plugins> 
      </build> 
     </profile> 
    </profiles> 
</project> 

最後,如果你不想情景模式設置爲默認激活,但你要在運行時強制其使用,你可以看看Maven Enforcer Plugin及其Require Active Profile rule。配置後,如果未指定所需的配置文件,則可以使構建失敗(因此,在這種情況下,Maven將通過插件引發錯誤,而不是作爲開箱即用的功能)。

+0

謝謝。我有activeByDefault參數,但問題是當我指定mvn clean install -Pp1,p2或類似的東西時。在這種情況下,p3不會被激活(我可以看到我的編譯失敗)。有什麼事情可以做嗎? – Rajat

+0

我更新了我的答案,以便更好地闡明您的觀點:除非在settings.xml級別聲明,否則實際上無法從命令行激活配置文件並將默認配置文件保留爲POM的一部分。 –