4

こんにちは、if 条件に基づいて特定の lib ファイルをコピーする ant スクリプトを作成しようとしています。ただし、次のエラーが発生するため、機能していないようです。

build.xml:20: ファイルセットは、ネストされた「if」要素をサポートしていません。

これは失敗する部分です:

<target name="resolve">
        <delete dir="${lib.dir}">
            <include name="*" />
        </delete>

        <copy todir="${lib.dir}">
            <fileset dir="ext-libs" >
                <if name="${release}" value="true">
                    <include name="hello-client-[^DEBUG]*.jar" />
                </if>
                <else>
                    <include name="hello-client-*DEBUG.*.jar" />
                </else>

            </fileset>
        </copy>
    </target>
4

3 に答える 3

5

@JoseKは正しいです。ANTファイルセットは、ネストされた「if」ステートメントをサポートしていません。実際、「if」ステートメントはコアANTの一部ではありません。推奨されるアプローチは、条件付きターゲットを使用することです(例を参照)。

@slipsetは正しい方向に進んでいます。Ivy構成を使用して、依存関係を選択的に選択できます。

この例は、2つの方法のいずれかで呼び出されるように設計されています

$ ant clean build
$ tree
.
|-- build.xml
|-- ivy.xml
`-- lib
    |-- slf4j-api-1.6.4.jar
    `-- slf4j-simple-1.6.4.jar

または

$ ant -Drelease=1 clean build
$ tree
.
|-- build.xml
|-- ivy.xml
`-- lib
    |-- logback-classic-1.0.3.jar
    |-- logback-core-1.0.3.jar
    `-- slf4j-api-1.6.4.jar

build.xml

<project name="demo" default="build" xmlns:ivy="antlib:org.apache.ivy.ant">

    <target name="resolve">
        <ivy:resolve/>
    </target>

    <target name="retrieve-alt" depends="resolve" unless="release">
        <ivy:retrieve pattern="lib/[artifact]-[revision](-[classifier]).[ext]" conf="altruntime"/>
    </target>

    <target name="retrieve-release" depends="resolve" if="release">
        <ivy:retrieve pattern="lib/[artifact]-[revision](-[classifier]).[ext]" conf="runtime"/>
    </target>

    <target name="build" depends="retrieve-alt,retrieve-release"/>

    <target name="clean">
        <delete dir="lib"/>
    </target>

</project>

ノート:

  • ターゲットのif句とunless句は、「release」プロパティの存在について条件付きテストを実行します。
  • ivy取得タスクは、構成を使用して、「lib」ディレクトリーにデータを取り込むために使用するjarを決定します。
  • ivyマッピングがソースやjavadocjarなどの追加のMavenアーティファクトをプルダウンする場合に備えて、取得パターンには「分類子」パターンが含まれています

ivy.xml

<ivy-module version="2.0">
    <info organisation="com.myspotontheweb" module="demo"/>

    <configurations>
        <conf name="compile" description="Required to compile application"/>
        <conf name="runtime" description="Additional run-time dependencies" extends="compile"/>
        <conf name="altruntime"   description="Alternative 'runtime' configuration" extends="compile"/>
        <conf name="test"    description="Required for test only" extends="altruntime"/>
    </configurations>

    <dependencies>
        <!-- compile dependencies -->
        <dependency org="org.slf4j" name="slf4j-api" rev="1.6.4" conf="compile->default"/>

        <!-- runtime dependencies -->
        <dependency org="ch.qos.logback" name="logback-classic" rev="1.0.3" conf="runtime->default"/>

        <!-- altruntime dependencies -->
        <dependency org="org.slf4j" name="slf4j-simple" rev="1.6.4" conf="altruntime->default"/>

        <!-- test dependencies -->
        <dependency org="junit" name="junit" rev="4.10" conf="test->default"/>
    </dependencies>

</ivy-module>

ノート:

  • 依存関係ごとに構成マッピングを常に指定することを強くお勧めします。これにより、jarの使用方法に直接マッピングされます。たとえば、クラスパスにデータが入力されます。

付録

アイビー構成の使用方法

Ivy構成を使用してMavenスコープをエミュレートできますが、実際には、ivy構成は依存関係の論理グループを表すことができます。

Javaビルドに必要な3つの標準クラスパスは次のとおりです。

<configurations>
    <conf name="compile" description="Required to compile application"/>
    <conf name="runtime" description="Additional run-time dependencies" extends="compile"/>
    <conf name="test"    description="Required for test only" extends="runtime"/>
</configurations>

より大きなセットを作成できるようにする「extends」構文に注意してください。たとえば、実行時のjarセットには、コードをコンパイルするために必要なものもすべて含まれています。

アイビーの構成は、ANTパスを選択的に設定するために使用できることに気付くまで理解するのが困難です。

<ivy:cachepath pathid="compile.path" conf="compile"/>

<javac ..... classpathref="compile.path"/>

または、ディレクトリを選択的に設定するために使用されます

<ivy:retrieve pattern="build/WEB-INF/lib/[artifact].[ext]" conf="runtime"/>

構成マッピング

マッピングは、プロジェクト内のjarのグループが他のプロジェクト内のjarのグループにどのように関連するかを決定するために使用されます。

これは通常、次のように発生します。

<dependency org="org.slf4j" name="slf4j-api" rev="1.6.4" conf="compile->default"/>

ここでは、コンパイル構成にリモートのデフォルト構成が入力されています(通常、他のモジュールは依存関係をコンパイルします)

于 2012-05-05T12:53:03.643 に答える
2

まあ、Apacheのドキュメントでは<if>、を 内にネストできないことは明らかです<fileset>

を条件付き引数として持つant-contrib ファイルセット タスクの例を見たことがあるかもしれませんif

代わりにダウンロードして使用できます。

于 2012-05-04T10:42:40.667 に答える
1

私はこれを自分で少し違った方法で行いました。私が持っている

<target name="internal-resolve" description="retrieve dependencies with ivy">
    <ivy:retrieve pattern = "${basedir}/lib/[conf]/[artifact].[ext]" conf = "${configuration}" />
</target>

lib/${configuration}これは、構成がパラメータとして渡されるディレクトリと呼ばれるディレクトリにjarを置きます

 <target name = "resolve-compile">
    <antcall target = "internal-resolve">
        <param name = "configuration" value = "compile"/>
    </antcall>
</target>

したがって、resolve-compile が呼び出されるたびに、jar が に配置されlib/compileます。これは私に与えます:

<path id = "compile.class.path">
    <fileset dir="${basedir}/lib/compile" includes="*.jar"/>
</path>

そして最後に

    <target name="compile" 
          depends="init, resolve-compile"
          description="Compile all Java-classes">
    <javac deprecation="false"
           encoding="utf8"
           debug="true"
           srcdir="${java.src.dir}"
           destdir="${build.classes.dir}"
           classpathref="compile.class.path"/>
  </target>

これを考えるとresolve-build、jar をドロップする独自のものを簡単に作成できます。lib/build

build確かに、次のように ivy.xml に構成を追加する必要があります。

  <configurations>
      <conf name="compile" visibility="public" description="Whatever"/>
      <conf name="build" visibility="public" description="Whatever"/>
  </configuration> 
于 2012-05-04T10:56:10.677 に答える