父级默认配置文件中的Maven活动不会传播给子级

时间:2017-10-11 06:32:39

标签: maven-3 maven-profiles

我有一个多模块maven项目,其中父项包含一个配置文件定义,激活该配置文件(使用activeByDefault),并且该子项应该考虑激活的配置文件并相应地修改其构建。我有这个设置,因为我想通过停用配置文件跳过子构建的某些部分(用于开发)。问题是父母中的个人资料的激活似乎没有传播给孩子。 为了重现这一点,我创建了一个小的父/子项目,如果 <ComboBox x:Name="comboBox_Copy" DisplayMemberPath="BoltPattern" SelectedItem="{Binding BoltPattern}"> 配置文件处于活动状态,子项目的构建将输出一条消息。我使用的是maven 3.5.0

这是我的父pom.xml:

activated-by-default

child pom.xml:

<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>profiletest</groupId>
<artifactId>parent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>parent</name>
<url>http://maven.apache.org</url>

<modules>
    <module>../child</module>
</modules>
<profiles>
    <profile>
        <id>activated-by-default</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
</profiles>

当我运行<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>profiletest</groupId> <artifactId>child</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>child</name> <url>http://maven.apache.org</url> <parent> <groupId>profiletest</groupId> <artifactId>parent</artifactId> <version>1.0-SNAPSHOT</version> <relativePath>../parent/pom.xml</relativePath> </parent> <profiles> <profile> <id>activated-by-default</id> <build> <plugins> <plugin> <groupId>com.github.ekryd.echo-maven-plugin</groupId> <artifactId>echo-maven-plugin</artifactId> <version>1.2.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>echo</goal> </goals> <configuration> <message>building with activated-by-default profile</message> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles> 时,即使mvn help:active-profiles package配置文件显示为活动状态,也不会执行相应的构建部分:

activated-by-default

1 个答案:

答案 0 :(得分:1)

问题在于父级配置文件的激活 似乎不会传播给孩子。

是的,这不起作用。原因是:个人资料不被继承(只有它们的效果是)。

相反,在处理继承之前先处理和解析配置文件。这意味着,即使父POM和子POM中的配置文件具有相同的ID,也完全不会交互。

标题恰当的博客文章Maven Profile Inheritance (okay, DISinheritance)中对此进行了很好的解释:

请参阅,父poms中的配置文件可以通过建立一个 儿童。激活后,它们将直接应用于父pom, 在那个父母被用来继承孩子之前。所以 孩子可能会感觉到父母的pom中主动轮廓的影响。

有时,这种间接继承效果很好。有时候,只是 充满裂纹。

因此,在您的情况下,Maven将在父POM中看到配置文件“默认激活”并将其激活,这是无用的,因为它为空。它还会在子POM中看到一个具有相同ID的配置文件,该配置文件也不起作用,因为它没有被激活(除非您在命令行上使用txtJOB_NUMBER_GotFocus())。最后,它将根据继承规则合并父子POM和子POM,以创建有效的POM,其中的任何一个概要文件均不包含任何内容。

另请参见Maven错误MNG-5127,该错误描述了相同的问题。