Maven属性加载顺序

时间:2018-04-01 13:39:21

标签: java maven

我知道可以在不同的位置定义Maven属性:

    本地计算机上的
  • ~/.m2/settings.xml
  • 项目家长POM中的
  • <properties>
  • 项目子模块POM中的
  • <properties>
  • 项目父POM的Maven个人资料中的
  • <properties>
  • <properties>在项目子模块POM的Maven配置文件中
  • -D直接在命令行上

但是不清楚属性的加载顺序。有人可以解释它的顺序吗?

1 个答案:

答案 0 :(得分:4)

根据我的测试,属性的优先级似乎是:

    通过命令行
  1. -D属性
  2. 位于<properties><profile>中的
  3. settings.xml 儿童pom中<properties>
  4. <profile>
  5. <properties>直接在儿童pom
  6. 父pom中<properties>中的
  7. <profile>
  8. <properties>直接在父pom
  9. 所以一般:

    • 所有事情之前的命令行
    • 父母之前的孩子之前的设置
    • 直接定义属性之前的配置文件

    我使用以下设置对其进行了测试。

    的settings.xml

    <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0                       https://maven.apache.org/xsd/settings-1.0.0.xsd">
        <profiles>
            <profile>
                <activation>
                    <activeByDefault>true</activeByDefault>
                </activation>
                <properties>
                    <custom.prop>settings</custom.prop>
                </properties>
            </profile>
        </profiles>
    </settings>
    

    父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/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>test</groupId>
        <artifactId>test-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>pom</packaging>
        <properties>
            <custom.prop>parent</custom.prop>
        </properties>
        <profiles>
            <profile>
                <activation>
                    <activeByDefault>true</activeByDefault>
                </activation>
                <properties>
                    <custom.prop>parent-profile</custom.prop>
                </properties>
            </profile>
        </profiles>
    </project>
    

    child pom.xml

    <?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>test</groupId>
        <artifactId>test-child</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>pom</packaging>
        <parent>
            <groupId>test</groupId>
            <artifactId>test-parent</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <relativePath>parent/pom.xml</relativePath>
        </parent>
        <properties>
            <custom.prop>child</custom.prop>
        </properties>
        <profiles>
            <profile>
                <activation>
                    <activeByDefault>true</activeByDefault>
                </activation>
                <properties>
                    <custom.prop>child-profile</custom.prop>
                </properties>
            </profile>
        </profiles>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <version>1.7</version>
                    <executions>
                        <execution>
                            <phase>validate</phase>
                            <goals>
                                <goal>run</goal>
                            </goals>
                            <configuration>
                                <target>
                                    <echo message="${custom.prop}" />
                                </target>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </project>
    

    像这样运行并删除echo ed属性,只要剩下属性就重复。