我有一个多模块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
答案 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,该错误描述了相同的问题。