30

プロジェクト用にMaven2ビルドを作成していますが、ビルドは異なる場所(ベルリン、パリ、北極など)と異なる環境(開発、本番)の両方に対して作成する必要があるため、プロファイルを作成しました。それらはプロパティを介して指定されます。したがって、「北極」「DEV」の場合、次のようにします。

-Dlocation=NorthPole -Denvironment=DEV

ここで、1つだけでなく、これらの両方のプロパティに基づいてporfileをアクティブ化したいと思います。だから私は次のことを試みました:

<profiles>
  <profile>
    <id>NOrth Pole DEV</id>
    <activation>
      <property>
        <name>location</name>
        <value>NorthPole</value>
      </property>
      <property>
        <name>environment</name>
        <value>DEV</value>
      </property>
    </activation>
    ... <!-- Set some North Pole DEV specific stuff -->
  </profile>
</profiles>

これは機能しません。Mavenはそこに最大で1つの<property>要素が表示されることを期待しています。

locationEnvプロパティには別の用途もあるので、単一の値のプロパティにすることNorthPole-DEVは私が望んでいることではないことに注意してください。

では、プロパティの組み合わせに基づいてプロファイルをアクティブ化する方法や回避策、またはその他の方法はありますか?

4

6 に答える 6

14

残念ながら、あなたの問題に対する良い解決策はありません (私が知らない新しい Maven 機能がない限り)。

理論的には、リストした 2 つのプロパティから値が連結される派生プロパティを導入できます。ただし、問題は、pom で定義されたプロパティの前にプロファイルが評価されるため、そのような派生プロパティを使用してプロファイルをアクティブ化できないことです :-(

同様の問題に対して私が考えることができる最善の回避策は、プロファイルを明示的にアクティブ化し、コマンド ライン パラメーターのさまざまな組み合わせを個別のバッチ/スクリプト ファイルに配置して、実行を簡単にし、入力ミスの問題を回避することでした。

于 2011-03-24T10:08:41.473 に答える
12

プロファイルを直接使用しない理由:

<profiles>
   <profile>
    <id>north-pole</id>
    <activation>
      <activeByDefault>false</activeByDefault>
    </activation>
    ....
  </profile>
   <profile>
    <id>dev</id>
    <activation>
      <activeByDefault>false</activeByDefault>
    </activation>
    ....
  </profile>
</profiles>

これで、コマンド ラインでプロファイルをアクティブ化できます。

mvn -Pdev,north-pole ...
于 2011-03-24T11:21:47.910 に答える
5

考えられる解決策

この拡張機能を試してください: https://github.com/kpiwko/el-profile-activator-extension

これにより、次のような構文を使用できます。

<profile>
    <id>NOrth Pole DEV</id>

    <activation>
        <property>
            <!-- mvel property name is obligatory -->
            <name>mvel</name>
            <value>isdef location &amp;&amp; location=="NorthPole" &amp;&amp; 
                   isdef environment &amp;&amp; environment=="DEV"</value>
        </property>
    </activation>
</profile>

自分で試したことはありませんが、いいプロジェクトのようです。

Maven の手動構成を回避する方法

プロジェクトの必要な 2 つの jar を $MAVEN_HOME/lib/ext に配置する必要があります。ただし、それらの構成を自動化することはできます。このような:

  • $MAVEN_HOME/lib/ext/el-profile-activator-extension.jar ファイルがない場合にアクティブ化されるプロファイルを追加できます
  • このプロファイルは、init フェーズで依存関係プラグインを使用して Maven から$MAVEN_HOME/lib/ext フォルダーにjar をダウンロードできます。
  • 次に、ビルドによって maven フォルダーが構成され、次のビルドが成功するというメッセージを書き出すことができます。

テスト済みプロファイル:

<profile>
    <id>prepare-maven-extended-libs</id>
    <activation>
      <file>
        <missing>${maven.home}/lib/ext/el-profile-activator-extension.jar</missing>
      </file>
    </activation>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.8</version>
                <executions>
                    <execution>
                        <id>copy</id>
                        <phase>validate</phase>
                        <goals>
                            <goal>copy</goal>
                        </goals>
                        <configuration>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>com.redhat.jboss.maven</groupId>
                                    <artifactId>el-profile-activator-extension</artifactId>
                                    <version>1.0.0-SNAPSHOT</version>
                                    <type>jar</type>
                                    <overWrite>true</overWrite>
                                    <outputDirectory>${maven.home}/lib/ext</outputDirectory>
                                    <destFileName>el-profile-activator-extension.jar</destFileName>
                                </artifactItem>
                                <artifactItem>
                                    <groupId>org.mvel</groupId>
                                    <artifactId>mvel2</artifactId>
                                    <version>2.1.3.Final</version>
                                    <type>jar</type>
                                    <overWrite>true</overWrite>
                                    <outputDirectory>${maven.home}/lib/ext</outputDirectory>
                                    <destFileName>mvel2.jar</destFileName>
                                </artifactItem>
                            </artifactItems>
                            <outputDirectory>${project.build.directory}/wars</outputDirectory>
                            <overWriteReleases>true</overWriteReleases>
                            <overWriteSnapshots>true</overWriteSnapshots>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.codehaus.gmaven</groupId>
                <artifactId>gmaven-plugin</artifactId>
                <version>1.4</version>
                <executions>
                    <execution>
                        <phase>validate</phase>
                        <goals><goal>execute</goal></goals>
                    </execution>
                </executions>
                <configuration>
                    <source>
                        fail("For profile activation we use an extension jar. It is now in your ${maven.home}/lib/ext folder. Please restart the build, and then it will be successful.")
                    </source>
                </configuration>
            </plugin>               
        </plugins>
    </build>
</profile>
于 2013-08-29T11:00:26.380 に答える
1

khmarbaise の答えは、私にはよりエレガントに思えます。Jan のコメントに、プロパティを追加することでファイルを参照できます。たとえば、プロファイル dev を使用すると、North Pole がアクティブになり、${location}-${env}.xml で NorthPole-dev.xml を参照できます。

他の人の返信にコメントを追加することができないため、別の返信を投稿する必要がありました。:(

于 2011-03-24T11:35:18.580 に答える
0

私はあなたがこのようなことをすることができると信じています

<properties>
        <env>dev</env>
        <location>North Pole</location>
    </properties>

<profiles>
        <!-- dev North Profile -->
        <profile>
            <id>dev North Pole</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <!-- qa North Profile -->
        <profile>
            <id>qa North Pole</id>
            <properties>
                         <env>qa</env>
                             <location>North Pole</location>
            </properties>
        </profile>

    </profiles>
<build>
do profile specific stuff here
</build>

当然のことながら、プロファイルをアクティブ化するには、コマンド'-P = devNorthPole'に追加できます。

于 2011-03-24T10:48:03.927 に答える