1

Maven ビルドで環境固有のリソースをプロビジョニングする標準的な方法はありますか?

たとえば、アプリケーションで使用されるローカル サービスの特定の IP アドレスが異なる環境でビルドが実行されることを期待しています。

1 つのオプションは、これをシェル環境変数として設定することですが、これが単体テストを実行する確実な jvm に伝播するかどうかは明らかではありません。

もう 1 つのオプションは、この情報を pom.xml サブクラス ファイルにプロビジョニングすることですが、これには他の問題が伴います (各開発者は独自の pom ファイルを維持する必要があります)。もちろん、これはあらゆる種類の自動ビルド環境を壊します。

4

2 に答える 2

1

次の例は、ビルド プロファイルを使用してさまざまなプロパティ値のセットを取得する方法を示しています。

-Pパラメーターを使用して、ビルド プロファイルの 1 つを有効にすることができます。

$ mvn -Ptest1 compile
..
[INFO] --- maven-antrun-plugin:1.7:run (default) @ demo ---
[INFO] Executing tasks

main:
     [echo] arbitrary.property=1.0
..

プロファイルを切り替えると、2 番目のプロファイルに関連付けられたプロパティ値が取得されます。

$ mvn -Ptest2 compile
..
[INFO] --- maven-antrun-plugin:1.7:run (default) @ demo ---
[INFO] Executing tasks

main:
     [echo] arbitrary.property=2.0
..

pom.xml

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.demo</groupId>
    <artifactId>demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
    </properties>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.7</version>
                <executions>
                    <execution>
                        <phase>compile</phase>
                        <configuration>
                            <target>
                                <echo message="arbitrary.property=${arbitrary.property}"/>
                            </target>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <profiles>
        <profile>
            <id>test1</id>
            <properties>
                <arbitrary.property>1.0</arbitrary.property>
            </properties>
        </profile>
        <profile>
            <id>test2</id>
            <properties>
                <arbitrary.property>2.0</arbitrary.property>
            </properties>
        </profile>
    </profiles>
</project>
于 2013-02-27T21:45:53.527 に答える
0

Surefire は、フォークされた JVM がユーザー環境の変化から可能な限り分離されるように最善を尽くします。Thin を渡す場合は、systemPropertyVariables構成オプションを使用して、フォークされた JVM のシステム プロパティを定義する必要があります。

他の人はプロフィールに言及しています。一般に、プロファイルを使用して環境固有の詳細を注入することは悪い計画であり、Maven アンチパターンですらあります。そのようなプロファイルがアンチパターンではないケースが 1 つだけあります (パターンに昇格するのではなく、アンチパターンのカテゴリから移動するだけであることに注意してください)。これは、プロファイルがテスト環境微調整し、接続していない場合です。tests.jarリアクターに。そのような場合、「調整された」アーティファクトはモジュールをエスケープせず、「悪いこと」を引き起こします (リポジトリ内のアーティファクトがリポジトリにデプロイされたときにどのプロファイルがアクティブであったか、またはビルドがそのアーティファクトを使用しているかどうかに関する不確実性など)。ローカル リポジトリまたは別のプロファイルを持つリモート リポジトリ)

systemPropertyVariablesCLI でシステム プロパティを使用し、構成オプションを使用して統合テストに渡します。

さらに「maven の方法」が必要な場合は、テスト対象のサービスを起動するために maven プラグインが必要になる可能性がありますが、Java ベース以外のサービスでは非常に困難な場合があります。Java ベースのサービスでそのようなことを行う方法の例については、cassandra-maven-pluginを参照してください。

于 2013-02-27T22:16:27.103 に答える