2016-02-14 117 views
3

我想爲定義特定屬性的模塊具有公共構建配置文件。在我的情況下,我正在運行jar-with-dependencies插件,並希望它只能在模塊定義main.class屬性時運行。Maven構建配置文件在子模塊pom中定義屬性時執行

我在我的父POM如下:

<profiles> 
    <profile> 
     <id>executable-jar</id> 
     <activation> 
      <property> 
       <name>main.class</name> 
      </property> 
     </activation> 
     <build> 
      <plugins> 
       <plugin> 
        <artifactId>maven-assembly-plugin</artifactId> 
        <version>2.6</version> 
        <configuration> 
         <descriptorRefs> 
          <descriptorRef>jar-with-dependencies</descriptorRef> 
         </descriptorRefs> 
         <archive> 
          <manifest> 
           <mainClass>${main.class}</mainClass> 
          </manifest> 
         </archive> 
        </configuration> 
        <executions> 
         <execution> 
          <id>make-assembly</id> <!-- this is used for inheritance merges --> 
          <phase>package</phase> <!-- bind to the packaging phase --> 
          <goals> 
           <goal>single</goal> 
          </goals> 
         </execution> 
        </executions> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 

,除非我運行Maven的命令時,所以它看起來像它不是檢測在其計數模塊的屬性來定義-Dmain.class它不會建成。這可以觸發嗎?

回答

2

你會以錯誤的方式去做。 Profiles are not intended to be used this way。您的配置不起作用,因爲以<property>激活的配置文件僅針對系統屬性的存在(或不存在),而不僅僅是任何Maven屬性。這是因爲活動配置文件需要從構建開始直接計算,而Maven屬性在此之後設置(您甚至可以在構建期間設置屬性)

您真正想要在這裏執行的操作是將在父POM中配置maven-assembly-plugin。 Maven的方式因爲這是要經過<pluginManagement>聲明:

插件管理包含了幾乎相同的方式插件的元素,除了不是配置插件對於這個特定的項目建設信息,它旨在配置從這個項目繼承的項目構建。但是,這隻能配置在子節點的插件元素中實際引用的插件。

這意味着您可以爲maven-assembly-plugin配置插件管理,並讓您希望爲其調用插件的項目引用該插件。

因此,在你的父POM,您將有以下幾點:

<pluginManagement> 
    <plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.6</version> 
     <executions> 
     <execution> 
      <id>make-assembly</id> 
      <phase>package</phase> 
      <goals> 
      <goal>single</goal> 
      </goals> 
      <configuration> 
      <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
      </descriptorRefs> 
      <archive> 
       <manifest> 
       <mainClass>${main.class}</mainClass> 
       </manifest> 
      </archive> 
      </configuration> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</pluginManagement> 

這宣告了maven-assembly-plugin管理部。對於這個被你的模塊使用,那麼你需要在你的孩子POM如下:

<properties> 
    <main.class>MyMainClass</main.class> 
</properties> 
<build> 
    <plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
    </plugin> 
    </plugins> 
</build> 

此聲明模塊將引用父POM管理部分。在這種情況下,Maven將正確使用構建屬性main.class

對於不需要調用此插件的模塊,只需要省略maven-assembly-plugin的插件聲明,不會發生任何事情。

+0

這解決了它。謝謝 – mangusbrother