📑

Apache Ivy を使用してみた

2024/06/07に公開

最初に

仕事で Java のコードに触れることが多いため、ライブラリの依存関係を管理するツールである、Apache Ivyを使用してみました。

Apache Ivy について

Apache Ivy は、Java プロジェクトの依存関係管理ツールです。
Maven のような機能を持ちながら、Ant と統合されることを前提として設計されています。
シンプルな XML ファイルを使って依存関係を定義し、それを自動的にダウンロード・管理してくれるため、手動でライブラリを管理する手間が省けます。

公式
https://ant.apache.org/ivy/

Apache Ivy のインストール

brew install ivy

Apache Ant のインストール

brew install ant

ivy.xml の作成

ivy で Javaの ライブラリを管理するため、プロジェクトが依存する Java のライブラリを ivy.xml に記述します。

今回は、junit のライブラリを取得します。
なお、依存関係の具体的な記述内容は maven のリポジトリで確認することができます。
dependency タグをコピーして ivy.xml に貼り付けます。

(https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api/5.11.0-M2)

<ivy-module version="2.0">
    <info organisation="org.apache" module="ivy-sample"/>
    <dependencies>
        <dependency org="org.junit.jupiter" name="junit-jupiter-api" rev="5.11.0-M2"/>
    </dependencies>
</ivy-module>

build.xml の作成

target name="resolve"
ant、ant resolve の実行で ivy.xml を参照してライブラリを取得するようにするための設定となります。

type="jar" を指定することで 対象を jar ファイルのみに限定し、javadoc や source がダウンロードされないようにしています。

target name="report"
ant report の実行で依存関係レポートを出力できるようにするための追加。レポートが不必要なら追加不要です。

target name="init" depends="resolve"
ant の実行で resolve が実行されるようにするための設定となります。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project basedir="." default="build" name="ivy-sample" xmlns:ivy="antlib:org.apache.ivy.ant">
    <property environment="env"/>
    <property name="debuglevel" value="source,lines,vars"/>
    <property name="target" value="1.8"/>
    <property name="source" value="1.8"/>
    <target name="resolve" description="--> retreive dependencies with ivy">
        <ivy:retrieve type="jar"/>
    </target>
    <target name="report" depends="resolve" description="--> generates a report of dependencies">
        <ivy:report todir="dependenciesReport"/>
    </target>
    <path id="ivy-sample.classpath">
        <pathelement location="classes"/>
        <fileset dir="lib" includes="*.jar"/>
    </path>
    <target name="init" depends="resolve">
        <mkdir dir="classes"/>
        <copy includeemptydirs="false" todir="classes">
            <fileset dir="src">
                <exclude name="**/*.launch"/>
                <exclude name="**/*.java"/>
            </fileset>
        </copy>
    </target>
    <target name="clean">
        <delete dir="classes"/>
    </target>
    <target depends="init" name="build">
        <echo message="${ant.project.name}: ${ant.file}"/>
        <javac debug="true" debuglevel="${debuglevel}" destdir="classes" includeantruntime="false" source="${source}"
               target="${target}">
            <src path="src"/>
            <classpath refid="ivy-sample.classpath"/>
        </javac>
    </target>
</project>

実行

ant resolve を実行すると必要な jar ファイルのダウンロードが行われます。
ant を実行すると必要な jar ファイルのダウンロード及びビルドが行われます。
(下記は ant resolve を実行)

ant resolve
Buildfile: /Users/murofushi/IdeaProjects/junit-sample/build.xml

resolve:
[ivy:retrieve] :: Apache Ivy 2.5.1 - 20221101102211 :: https://ant.apache.org/ivy/ ::
[ivy:retrieve] :: loading settings :: url = jar:file:/opt/homebrew/Cellar/ant/1.10.14/libexec/lib/ivy-2.5.1.jar!/org/apache/ivy/core/settings/ivysettings.xml
[ivy:retrieve] :: resolving dependencies :: org.apache#junit-sample;working@resukyunaunoMBP
[ivy:retrieve]  confs: [default]
[ivy:retrieve]  found org.junit.jupiter#junit-jupiter-api;5.11.0-M2 in public
[ivy:retrieve]  found org.opentest4j#opentest4j;1.3.0 in public
[ivy:retrieve]  found org.junit.platform#junit-platform-commons;1.11.0-M2 in public
[ivy:retrieve]  found org.apiguardian#apiguardian-api;1.1.2 in public
[ivy:retrieve] :: resolution report :: resolve 166ms :: artifacts dl 21ms
        ---------------------------------------------------------------------
        |                  |            modules            ||   artifacts   |
        |       conf       | number| search|dwnlded|evicted|| number|dwnlded|
        ---------------------------------------------------------------------
        |      default     |   4   |   0   |   0   |   0   ||   6   |   0   |
        ---------------------------------------------------------------------
[ivy:retrieve] :: retrieving :: org.apache#junit-sample
[ivy:retrieve]  confs: [default]
[ivy:retrieve]  4 artifacts copied, 0 already retrieved (360kB/23ms)

BUILD SUCCESSFUL
Total time: 0 seconds

最後に「BUILD SUCCESSFUL」と表示されたら成功です🙌

jar の確認

lib ディレクトリー配下に、自動的に依存する jar ファイルをダウンロードすることができました🙌

tree lib 
lib
├── apiguardian-api-1.1.2.jar
├── junit-jupiter-api-5.11.0-M2.jar
├── junit-platform-commons-1.11.0-M2.jar
└── opentest4j-1.3.0.jar

まとめ

かなり簡単に使うことができました😀
長年 Antを使っているプロジェクトで、ソースツリーのディレクトリー構造を変えられない場合など、より適したツールであると感じました🙌

レスキューナウテックブログ

Discussion