8

maven ビルド コマンドにパラメーターとして渡された環境変数に応じて、いくつかの ant コマンドを実行する必要があります。

現在、3 つのタスク ブロックがあり、条件のないタスク ブロックのみが実行されています。

<tasks name="isProdCheck">
  <condition property="isProd">
    <equals arg1="${environment}" arg2="PROD" />
  </condition>
</tasks>

<tasks if="isProd" depends="isProdCheck">
...
</tasks>

<tasks>
... I am the only block executed
</tasks>

私は何を間違っていますか、これを行うためのより良い方法はありますか?

4

4 に答える 4

12

まず、Maven 1.x の Web サイトによると、maven 1.x の現在の安定版リリースはバージョン 1.4 ではなく、バージョン 1.1 です。次に、AntRun プラグイン バージョン 1.7 はなく、私の知る限り、これは Maven 2 プラグインです。3 番目に、使用している構文は、やはり Maven 2 に関する属性の使用と非常によく似ているようです。

したがって、何かが欠けている可能性がありますが、これは非常に紛らわしいため、質問でこれらの点を明確にする必要があります。

とにかく、Maven 1について明示的に言及したように、私は答えようとします。よく覚えていれば、カスタム目標を作成して Jelly のcore:iforを使用していましたcore:when。これを行うには、次のようなものを に提供しますmaven.xml

<project xmlns:j="jelly:core" xmlns:ant="jelly:ant">
  <goal name="my-goal">
    <j:if test="${environment == 'PROD'}">
      <ant:xxx .../>
    </j:if>
  </goal>
</project>

構文がよくわかりません。この Maven 1 のものはすべて遠すぎて、テストしませんでした (Maven 1 をインストールするのが面倒です)。しかし、私はあなたがそうするだろうと思います。スクリプト リファレンスが役立つ場合があります。

正直なところ、Maven 2.x よりも Maven 1.x を好む正当な理由があることを願っています :)

更新: OP が実際に Maven 2 を使用しているように見えるので、それに応じて質問を更新します。if目的の動作を実装するには、以下に示すようにAnt-contrib のタスクを使用できます。

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>1.3</version>
        <executions>
          <execution>
            <phase>compile</phase>
            <goals>
              <goal>run</goal>
            </goals>
            <configuration>
              <tasks>
                <taskdef resource="net/sf/antcontrib/antcontrib.properties"
                  classpathref="maven.plugin.classpath" />
                <if>
                  <equals arg1="${foo}" arg2="bar" />
                  <then>
                    <echo message="The value of property foo is bar" />
                  </then>
                  <else>
                    <echo message="The value of property foo is not bar" />
                  </else>
                </if>
              </tasks>
            </configuration>
          </execution>
        </executions>
        <dependencies>
          <dependency>
            <groupId>ant-contrib</groupId>
            <artifactId>ant-contrib</artifactId>
            <version>20020829</version>
          </dependency>
        </dependencies>
      </plugin>
    </plugins>
  </build>

そして、呼び出しますmvn compile -Dfoo=bar(これは単なる例です)。

しかし、これはすべて、物事を行うための「Maven 方法」ではありません。あなたがやろうとしていることを少しよく理解したので(ただし、最終的な目標を説明していないので完全ではありません)、ビルドプロファイルを使用する方が適切だと思います。あなた自身の答えを読んで、物事を複雑にしすぎています (そして、あなたは間違った道を進んでいます)。

あなたが Maven の初心者であることは理解していますが、Ant に頼るのではなく、Maven を使用することをお勧めします。また、質問を開くときは、特定の解決策を尋ねるのではなく、一般的な問題を説明する方が適切な回答が得られます。ここでは、あなたが実際に達成しようとしていることがわからないため、これ以上のガイダンスを提供することはできません.

于 2009-12-29T16:55:05.473 に答える
0

次のように、プロジェクトルートのbuild.xmlファイルに「if」属性と条件プロパティを持つ複数の名前付きターゲットを作成することで、この問題を解決しました。

<target name="prod" if="isProd" depends="isProdCheck">
    // do something
</target>

必要なコマンドラインスイッチのプロパティを渡し、MavenPOMのタスクセクションからbuild.xmlファイルのantターゲットを次のように呼び出しました。

<tasks>
 <ant antfile="${basedir}/build.xml">
    <property name="environment" value="${environment}"/>        
    <target name="prod"/>
 </ant>          
</tasks>
于 2009-12-29T23:46:18.620 に答える