18

私は現在 にいANT_HOMEます/home/<myuser>/ant/1.8.4/ant-1.8.4

依存関係を含む Apache Ivy tarball をダウンロードしました。に抽出しました/home/<myuser>/ivy/2.3.0-rc1/ivy-2.3.0-rc1

次に、にコピー/home/<myuser>/ivy/2.3.0-rc1/ivy-2.3.0-rc1/lib/*.jarしましたANT_HOME/lib。Ant がプラグイン/拡張機能でどのように機能するかについての私の理解が正しければ、Ant は実行時に Ivy のすべてのタスクにアクセスできるはずです。

次の質問は、Ant ビルドファイル内で Ivy タスクをどのように定義するかということです。ivy-retrieveivy-resolveおよびivy-publishタスクを使用したいとします。コマンドラインからAntビルドを実行するときにこれらのタスクを機能させるために(XMLで)行う必要があるすべての構成は何ですか(Ant-Eclipseプラグインを介してビルドしません)。前もって感謝します!

4

2 に答える 2

64

最初に<taskdef>、Ivy タスクを指すように を定義する必要があります。

<property environment="env"/>
<property name="ivy.home" value="${env_IVY_HOME}"/>

<taskdef resource="org/apache/ivy/ant/antlib.xml">
    <classpath>
        <fileset dir="${ivy.home}">
            <include name="*.jar"/>
        </fileset>
    </classpath>
</taskdef>

これにより、Ivy タスクにアクセスできるようになります。これらのタスクは次のように使用します。

<cachepath pathid="main.classpath" conf="compile"/>

問題は、Ivy タスク名が他の Ant タスクと衝突する可能性があることです。たとえば、Ivy タスクがあります<report>。これを解決するには、Ivy 名前空間を作成します。<project>これを行うには、次のように、エンティティの名前空間に参照を配置します。

<project name="my.proj" default="package" basedir="."
    xmlns:ivy="antlib:org.apache.ivy.ant"/>

これで、Ivy タスクを定義するときに、名前空間へのそのantlib:org.apache.ivy.ant参照を使用できます。ivy前と同じ taskdef ですが、uriフィールドがあります。

<property environment="env"/>
<property name="ivy.home" value="${env_IVY_HOME}"/>

<taskdef resource="org/apache/ivy/ant/antlib.xml"
    uri="antlib:org.apache.ivy.ant">
    <classpath>
        <fileset dir="${ivy.home}">
            <include name="*.jar"/>
        </fileset>
    </classpath>
</taskdef>

ちなみに、それは特別なことではありませんuri。私はこれを行うことができました:

<project name="my.proj" default="package" basename="."
   xmlns:ivy="pastrami:with.mustard">

[...]
<taskdef resource="org/apache/ivy/ant/antlib.xml"
    uri="pastrami:with.mustard">
    <classpath>
        <fileset dir="${ivy.home}">
            <include name="*.jar"/>
        </fileset>
    </classpath>
</taskdef>

ポイントは、タスク名の前にivy:. これの代わりに:

<cachepath pathid="main.classpath" conf="compile"/>

これを行うことができます:

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

そして、それが Ivy Ant タスクへのアクセスを取得する方法です。

これで、Ivy Ant タスクにアクセスできるようになりました。ivysettings.xmlファイルを定義し、<ivy:settings/>タスクを使用してそこを指す必要があります。

 <ivy:settings file="${ivy.home}/ivysettings.xml"/>

ivysettings.xmlIvy には、ワールド ワイドの Maven リポジトリ システムを指すデフォルトファイルが組み込まれています。会社全体の Maven リポジトリがない場合は、デフォルトのivysettings.xmlファイルを使用できます。

<ivy:settings/>

それはとても簡単です。

それが完了したら、ファイルを読み込んで解決する必要があります。ivy.xmlファイルは通常、プロジェクトのルートにあるbuild.xmlファイルと同じディレクトリにあります。

基本的に、ivy.xmlファイルには、プロジェクトに取り込みたいサードパーティの jar への参照が含まれています。例えば:

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

これが言っているのは、log4j.jarコンパイル (およびテストのコンパイル) には (revision 1.2.17) が必要junit.jarであり、テスト コードのコンパイルには (revision.4.10) が必要だということです。

これは、構成を Maven の構成にcompile->defaultマッピングしたものです (これは、Jar とそれが依存する可能性のある他のすべての jar が必要であることを示しています。compiledefault

私のcompile設定はどこから来たのですか?で定義しますivy.xml。10 個の標準構成があります。これもあなたのivy.xmlファイルに入ります:

<configurations>
  <conf name="default" visibility="public" description="runtime dependencies and master artifact can be used with this conf" extends="runtime,master"/>
  <conf name="master" visibility="public" description="contains only the artifact published by this module itself, with no transitive dependencies"/>
  <conf name="compile" visibility="public" description="this is the default scope, used if none is specified. Compile dependencies are available in all classpaths."/>
  <conf name="provided" visibility="public" description="this is much like compile, but indicates you expect the JDK or a container to provide it. It is only available on the compilation classpath, and is not transitive."/>
  <conf name="runtime" visibility="public" description="this scope indicates that the dependency is not required for compilation, but is for execution. It is in the runtime and test classpaths, but not the compile classpath." extends="compile"/>
  <conf name="test" visibility="private" description="this scope indicates that the dependency is not required for normal use of the application, and is only available for the test compilation and execution phases." extends="runtime"/>
  <conf name="system" visibility="public" description="this scope is similar to provided except that you have to provide the JAR which contains it explicitly. The artifact is always available and is not looked up in a repository."/>
  <conf name="sources" visibility="public" description="this configuration contains the source artifact of this module, if any."/>
  <conf name="javadoc" visibility="public" description="this configuration contains the javadoc artifact of this module, if any."/>
   <conf name="optional" visibility="public" description="contains all optional dependencies"/>
 </configurations>

任意の構成名を使用できますが、これらはデフォルトの Maven 構成にマップされ、広く使用されています。

ivy.xmlファイルを定義したら、依存関係を解決するために使用できます<ivy.resolve>

<ivy:resolve/>

したがって、次のようになります。

  1. <taskdef>Ivy Ant タスクをビルドにbuild.xml組み込むための使用方法。
  2. Ivy Ant タスク<ivy:settings>を使用して Ivy を構成する方法。
  3. <ivy:resolve/>ファイルを読み取り、ivy.xmlサードパーティの jar 依存関係を解決するために使用する方法。

ここで、おそらくこれらの jar ファイルを実際に使用したいと思うでしょう。これを行うには、次の 3 つの方法があります。

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

このタスクは、ファイルの構成にある jar を指す<ivy:cachepath/>クラスパス (この場合はmain.classpathと呼ばれます) を作成します。これはほとんどの場合に使用されます。ivy.xmlcompile

ファイルセットが必要な場合は、これを使用できます。

 <ivy:cachefileset setid="compile.fileset" conf="compile"/>

この場合、refid のファイルセットが作成されますcompile.fileset

場合によっては、プロジェクトに jar を持ち込む必要があります。たとえば、war または ear ファイルを作成する場合は、jar ファイルを同封します。その場合、これを使用できます:

<property name="lib.dir" value="${target.dir}/lib"/>
<ivy:retrieve pattern="${lib.dir}/[artifact].[ext]"
     conf="runtime"/>

これにより、jar が${lib.dir}ディレクトリにフェッチされるため、それらを war または ear に含めることができます。

長い回答で申し訳ありませんが、カバーする手順がたくさんあります。マニングの著書『Ant in Action』には、アイビーに関する章全体が含まれていることを強くお勧めします。

于 2012-09-12T03:06:04.780 に答える
14

David は非常に良い答えを出しましたが、taskdef は必須ではないことを指摘したいと思います。ivy.jar が予想される場所にある場合、ANT ファイルの先頭にある名前空間宣言で十分です。

<project ..... xmlns:ivy="antlib:org.apache.ivy.ant">

詳細については、ANT ライブラリの仕組みについて読むことをお勧めします。

次の回答は、「アイビーの設定」に関するアドバイスをさらに提供します。

于 2012-09-12T21:30:09.050 に答える