開発時にローカルでテストし、ステージング環境に対して変更をテストし、最終的に本番環境にデプロイできるようにしたいと考えています。
心に留めておく必要がある重要なことは、アーティファクトがローカル/リモート リポジトリにデプロイされるとき、アクティブなプロファイルはデプロイされるものの一部ではないということです。 Web アプリケーションが DEV プロファイルをアクティブにしてビルドされたのか、PROD プロファイルをアクティブにしてビルドされたのかを知る方法であり、そのビルドされたアーティファクトが本番環境にデプロイされたときに、大失敗する可能性があります。
つまり、アーティファクトがデプロイメント環境から独立していることを確認する必要があります。
これは、たとえば、次から構成を取得することを意味します。
- クラスパス上のファイル
- システムプロパティ
- jndi エントリ
たとえば、Tomcat にデプロイする場合、configuration.properties を$CATALINA_HOME/lib
起動時の webapp はgetClass().getResource('/configuration.properties')
、プロパティ ファイルを解決するために使用し、ファイルが見つからない場合は起動に失敗します (フェイルファースト)。
に configuration.properties のテスト バージョンを配置することで、ユニット/統合テストで別の構成を使用できるようになりますsrc/test/resources
。
<scope>provided</scope>
アプリケーションのスタイルの依存関係にも同じ原則を使用します。つまり、コンテナーが提供することで契約されている依存関係は、コンテナーによって提供される必要があります。そのため、Maven を使用して tomcat/jetty の製品版を自分でビルドし、必要な依存関係をそのアセンブリに追加することができます。これは、本番バージョンが MySQL データベースを使用するようなものであるため、mysql-jdbc ドライバーを に追加する必要があります$CATALINA_HOME/lib
。実際には、一部のビットを含めて他のビットを除外して zip を再パックするだけなので、アセンブリ プラグインを使用してこれを行うのは比較的簡単です。
ローカルでテストする場合は、 や などのヘルパー プラグインのrun
ゴールを利用する必要がjetty:run
ありtomcat:run
ます。ここでの解決策は、プラグインのクラスパスにのみ影響を与えているアーティファクトの依存関係に影響を与えていないため、プロファイルを介してこれらのプラグインの依存関係を与えることには何の問題もないということです。
例えば
<project>
<!-- ... some stuff .. -->
<profiles>
<profile>
<id>DEV</id>
<build>
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
システム プロパティまたはクラスパスの追加を構成して、必要な構成ファイルを取得することもできます。
これらすべての最終結果は、アーティファクトが環境に依存しないままであり、さまざまな環境に対して簡単にテストできることです。
これがあなたの質問に答えてくれることを願っています(横向きであっても)