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

3

我希望为定义特定属性的模块拥有一个通用的构建配置文件。在我的情况下,我正在运行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个回答

2
你的方法是错误的。Profiles不应该被用于这种方式。你的配置无法工作,因为使用<property>激活的profile只会针对系统属性的存在(或不存在),而不是任何Maven属性。这是因为需要从构建的开始计算活动的profiles,而Maven属性是在此之后设置的(甚至可以在构建期间设置属性)。
你真正想做的是将maven-assembly-plugin的配置因素提取到一个父POM中。Maven的方法是通过声明<pluginManagement>来完成:

Plugin Management包含插件元素,方式与上述类似,但不同的是,它旨在为继承自此项目的项目构建配置插件信息。但是,这仅配置实际在子插件元素中引用的插件。

这意味着你可以为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的插件声明,什么也不会发生。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接