Maven:从文件中读取属性(如果存在),否则设置默认属性

时间:2015-05-05 17:08:02

标签: maven properties-file

我知道在许多情况下,(笨重但是)可能使用两个配置文件导致从文件中读取属性(如果存在),否则设置默认值,例如。

<profile>
    <id>my-default-props</id>
    <activation>
        <file>
            <missing>${my.file.path}</missing>
        </file>
    </activation>
    <properties>
        <my.prop1>Blah</my.prop1>
        <my.prop2>Another</my.prop2>
    </properties>
</profile>

<profile>
    <id>read-my-props</id>
    <activation>
        <file>
            <exists>${my.file.path}</exists>
        </file>
    </activation>
    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>properties-maven-plugin</artifactId>
                <version>1.0-alpha-2</version>
                <executions>
                    <execution>
                        <phase>initialize</phase>
                        <goals>
                            <goal>read-project-properties</goal>
                        </goals>
                        <configuration>
                            <files>
                                <file>${my.file.path}</file>
                            </files>
                            <quiet>false</quiet>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</profile>

不幸的是,这对我不起作用:我需要在各种子项目中覆盖“my.file.path”的值,但是在生命周期的早期评估配置文件激活。这意味着在评估期间不使用子项目的值,并且永远无法正确读取属性。

这对我来说似乎是一个普遍的要求,但谷歌搜索告诉我。谁能告诉我如何实现这一目标?感谢。

1 个答案:

答案 0 :(得分:2)

要回答我自己的问题......我发现我可以使用两个插件的组合,而不是使用配置文件,这些插件可以在同一个阶段中一个接一个地执行:

  1. properties-maven-plugin:read-project-properties,quiet设置为true
  2. maven-antrun-plugin:使用<exportAntProperties>true</exportAntProperties>
  3. 运行

    由于属性仅在尚不存在时设置,因此具有设置默认值的效果。

    警告:这与设置一堆属性默认值(如果文件不存在)完全相同。这取决于每个属性。这可能会导致混合不一致的属性(例如MySQL数据库驱动程序与PostgreSQL数据库URL)。

    示例:

           <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>properties-maven-plugin</artifactId>
            <version>1.0-alpha-2</version>
            <executions>
                <execution>
                    <id>read-my-properties</id>
                    <phase>initialize</phase>
                    <goals>
                        <goal>read-project-properties</goal>
                    </goals>
                    <configuration>
                        <files>
                            <file>${my.properties.file}</file>
                        </files>
                        <quiet>true</quiet>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
                <execution>
                    <id>set-default-properties</id>
                    <phase>initialize</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                    <configuration>
                        <exportAntProperties>true</exportAntProperties>
                        <target>
                            <property name="db.driver" value="org.postgresql.Driver"/>
                            <property name="db.name" value="my_db_name"/>
                            <!-- etc. -->
                        </target>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    

    这里的关键是没有发生配置文件激活评估 - 由于发生得太早而无法正常工作。在${my.properties.file}块期间可以安全地使用<execution>属性,因为这些属性在子项目有机会正确覆盖该值之后发生。