Maven: прочитать свойства из файла, если он существует, и установить свойства по умолчанию в противном случае

Я знаю, что во многих случаях (неуклюже, но) можно использовать два профиля, чтобы привести к чтению свойств из файла, если он присутствует, и установить значения по умолчанию в противном случае, например.

<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» в различных дочерних проектах, но активация профиля оценивается очень рано в жизненном цикле. Это означает, что значение дочернего проекта не используется во время оценки, а свойства никогда не считываются должным образом.

Мне это кажется достаточно распространенным требованием, но Google говорит мне об обратном. Может ли кто-нибудь сказать мне, как я могу достичь этой цели? Спасибо.


person pogul    schedule 05.05.2015    source источник
comment
Можете ли вы уточнить, какова цель этих профилей? Чего бы вы хотели этим добиться?   -  person khmarbaise    schedule 05.05.2015
comment
В основном это позволяет сборке совместно использовать свойства с локальным экземпляром приложения. Например, приложение может быть настроено на использование БД с именем my_app_db, и я хочу, чтобы сборка (например, для интеграционных тестов) использовала ту же конфигурацию БД.   -  person pogul    schedule 06.05.2015


Ответы (1)


Чтобы ответить на мой собственный вопрос... Я обнаружил, что вместо использования профиля я могу использовать комбинацию двух плагинов с выполнением, которое срабатывает одно за другим на одной и той же фазе:

  1. properties-maven-plugin:read-project-properties с тихим значением true
  2. maven-antrun-plugin: запустить с <exportAntProperties>true</exportAntProperties>

Поскольку свойства устанавливаются только в том случае, если они еще не существуют, это приводит к установке значений по умолчанию.

Предупреждение: это не совсем то же самое, что задать несколько значений свойств по умолчанию, если файл не существует. Вместо этого это делается для каждого свойства. Это потенциально может привести к сочетанию несогласованных свойств (например, драйвер базы данных MySQL с URL-адресом базы данных PostgreSQL).

Пример:

       <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>, так как это происходит после того, как дочерний проект получил возможность правильно переопределить значение.

person pogul    schedule 06.05.2015