web-dev-qa-db-ja.com

Antビルド用にIvyを構成する方法

現在、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/*.jarANT_HOME/libにコピーしました。 Antがプラグイン/拡張機能でどのように機能するかについての私の理解が正しければ、Antは実行時にIvyのすべてのタスクにアクセスできるはずです。

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

16
IAmYourFaja

まず、Ivyタスクを指す<taskdef>を定義する必要があります。

<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"/>

Ivyにはデフォルトのivysettings.xmlファイルが埋め込まれており、World Wide Mavenリポジトリシステムを参照できます。会社全体のMavenリポジトリーがない場合は、デフォルトのivysettings.xmlファイルを使用できます。

<ivy:settings/>

それはとても簡単です。

それが完了したら、 resolveivy.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(リビジョン1.2.17)が必要であり、テストコードのコンパイルにはjunit.jar(リビジョン.4.10)が必要です。

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

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

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

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

<ivy:cachepath/>タスクは、ivy.xmlファイルのcompile構成。これはほとんどの場合使用されます。

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

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

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

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

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

これにより、jarが${lib.dir}ディレクトリにフェッチされるため、戦争や耳に含めることができます。

長い答えで申し訳ありませんが、カバーする多くのステップがあります。私はマニングの本 Ant in Action を強くお勧めします。

60
David W.

デビッドは非常にすばらしい答えを出しました、しかし私はtaskdefが必要とされないことを指摘したいと思います。 ivy.jarが予想される場所にある場合、ANTファイルの上部にある名前空間宣言で十分です。

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

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

次の回答は、「アイビーの設定」に関するいくつかのアドバイスを示しています。

13
Mark O'Connor