Maven每次只激活两个配置文件中的一个



我有一个maven pom.xml文件,它有多个配置文件:

<profiles>
  <profile>
    <id>p1</id>
  </profile>
  <profile><id>p2</id></profile>
  <profile><id>p3</id></profile>
  <profile><id>p4</id></profile>
  <profile><id>p5</id></profile>
</profiles>

我通过配置文件-Dp1、p5或类似的方式激活p1、p2、p5中的一个或多个。但我希望p3和p4中的任何一个始终处于活动状态。默认情况下,它应该始终为p3。如果我指定-Dp4,那么p3应该变为非活动状态。

理想情况下,如果我指定-Dp3,p4,maven应该抛出一个错误,但这不是必须的。

知道怎么做吗?

首先,您不通过-D选项激活配置文件,而是通过命令行的-P选项激活配置。或者,您可以通过配置文件部分的activation元素激活配置文件,默认情况下将其设置为活动,或者,如果配置文件是通过activeProfiles部分在settings.xml中定义的。

如果指定了不必要的概要文件,Maven不会抛出错误。

因此,如果你想默认激活配置文件3,你可以在其profile部分设置如下:

        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>

如果您想打开和关闭一个配置文件,请在命令行中的配置文件名称之前使用!-表示法,例如:

mvn clean install -Pp3!p4

它将激活p3配置文件并停用p4配置文件。

请注意,!字符在bash中是一个特殊的字符,因此您应该将其用单引号括起来。

但是,请注意,从命令行激活配置文件将停用POM中默认活动的配置文件,而不是作为settings.xml的一部分默认活动的概要文件(但是,该机器上的所有Maven构建都将共享该概要文件)。

来自Maven关于配置文件的官方文档

除非使用前面描述的方法之一激活同一POM中的另一个配置文件,否则该配置文件将自动为所有构建激活。当POM中的配置文件在命令行上或通过其激活配置被激活时,所有默认激活的配置文件都会自动停用。

您可以使用以下关于配置文件激活的POM示例:

<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.sample</groupId>
    <artifactId>profiles-sample</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <profiles>
        <profile>
            <id>p1</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-antrun-plugin</artifactId>
                        <version>1.5</version>
                        <executions>
                            <execution>
                                <id>p1</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>run</goal>
                                </goals>
                                <configuration>
                                    <target>
                                        <echo message="hello from p1" />
                                    </target>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
        <profile>
            <id>p2</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-antrun-plugin</artifactId>
                        <version>1.5</version>
                        <executions>
                            <execution>
                                <id>p2</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>run</goal>
                                </goals>
                                <configuration>
                                    <target>
                                        <echo message="hello from p2" />
                                    </target>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
        <profile>
            <id>p3</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-antrun-plugin</artifactId>
                        <version>1.5</version>
                        <executions>
                            <execution>
                                <id>p3</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>run</goal>
                                </goals>
                                <configuration>
                                    <target>
                                        <echo message="hello from p3" />
                                    </target>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>

最后,如果您不想默认激活配置文件,但希望在运行时强制使用它,您可以查看Maven Enforcer插件及其"要求激活配置文件"规则。配置后,如果没有指定所需的配置文件,则可以使构建失败(因此,是的,在这种情况下,Maven将通过插件而不是开箱即用的功能抛出错误)。

相关内容

最新更新