@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"/>
ここでは、コンパイル構成にリモートのデフォルト構成が入力されています(通常、他のモジュールは依存関係をコンパイルします)