当子模块pom定义属性时,Maven构建配置文件会执行

时间:2016-02-14 18:55:48

标签: java maven

我希望为定义特定属性的模块提供公共构建配置文件。在我的情况下,我正在运行jar-with-dependencies插件,并希望它仅在模块定义main.class属性时运行。

我的父母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,否则不会构建它,因此看起来它没有检测到它所计算的模块中的属性。这可以被触发吗?

1 个答案:

答案 0 :(得分:2)

你是以错误的方式去做的。 Profiles are not intended to be used this way。您的配置不起作用,因为使用<property>激活的配置文件仅针对系统属性的存在(或不存在),而不仅仅是任何Maven属性。这是因为活动配置文件需要从构建开始直接计算,而Maven属性在此之后设置(您甚至可以在构建期间设置属性)

您真正想要做的是在父POM中分解maven-assembly-plugin的配置。 Maven的方式是通过声明<pluginManagement>

  

插件管理包含插件元素的方式大致相同,除了不是为此特定项目构建配置插件信息,它旨在配置从此继承的项目构建。但是,这只配置了子节点中plugins元素中实际引用的插件。

这意味着您可以为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的插件声明,不会发生任何事情。