2016-02-14 53 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