为同一Maven属性定义不同的配置文件值

6
我在使用maven属性配置文件时遇到了问题。我有两个配置文件,每个配置文件都有一个名为'prop.key'的属性,但是值不同。当我执行mvn clean package -PA -PBmvn clean package -PB -PA 命令时,它们都使用相同的值 'B-1.0-SNAPSHOT'。我正在使用maven 3.0.4版本。
以下是我的POM文件:
<?xml version="1.0" encoding="UTF-8"?>
<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.test.module</groupId>
    <artifactId>test-module</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <properties>
        <prop.key>UNKNOWN</prop.key>
    </properties>

    <profiles>
        <profile>
            <id>A</id>
            <properties>
                <prop.key>A-${project.version}</prop.key>
            </properties>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-antrun-plugin</artifactId>
                        <version>1.2</version>
                        <executions>
                            <execution>
                                <id>A</id>
                                <phase>package</phase>
                                <configuration>
                                    <tasks name="a" description="a-desc">
                                        <echo message="RUN A = ${prop.key}" level="info"/>
                                    </tasks>
                                </configuration>
                                <goals>
                                    <goal>run</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>

        <profile>
            <id>B</id>
            <properties>
                <prop.key>B-${project.version}</prop.key>
            </properties>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-antrun-plugin</artifactId>
                        <version>1.2</version>
                        <executions>
                            <execution>
                                <id>B</id>
                                <phase>package</phase>
                                <configuration>
                                    <tasks name="b" description="b-desc">
                                        <echo message="RUN B = ${prop.key}" level="info"/>
                                    </tasks>
                                </configuration>
                                <goals>
                                    <goal>run</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>

我找到了一个类似的话题,但结果相反!这是maven的一个bug还是feature?

3个回答

4
您可以简写为 mvn package -PA,B
结果是相同的: [echo] RUN A = B-1.0-SNAPSHOT[echo] RUN B = B-1.0-SNAPSHOT 这是maven的正确行为。
每次运行一个属性只能有一个特定的值。您可以用配置文件中的版本覆盖“默认值”。但是,如果在两个配置文件中重新定义它并同时激活它们,则其中一个配置文件将“获胜”。
不可能对于同一属性每个配置文件都有一个值。配置文件没有自己的变量范围。属性始终是全局的。

Marc von Renteln,感谢您的评论。可以使用过滤和*.properties文件,但这对我的情况没有帮助。我已经找到了解决方法,即复制当前结果的目录。 - Paweł Dulęba
@Marc,你是如何决定哪个配置文件“胜出”的?是通过传递给“-P”参数的顺序还是其他什么方式? - Mukund Jalan

0
我认为您会得到这种行为,是因为配置文件的最后一个参数被选中了。请尝试。
mvn clean package -PA,B

请参阅Maven配置文件介绍

可以使用-P CLI选项显式指定配置文件。

此选项需要一个参数,该参数是要使用的配置文件ID的逗号分隔列表。当指定此选项时,除了在选项参数中指定的配置文件之外,不会激活任何其他配置文件。


0
当你运行mvn package -PA,B时,Maven将读取A和B两个配置文件,并且在pom.xml文件中后面的属性将优先(B在pom.xml中定义在A之下),结果是<prop.key>B-${project.version}</prop.key>将被使用。

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