Apache Ivy を使用してみた
最初に
仕事で Java のコードに触れることが多いため、ライブラリの依存関係を管理するツールである、Apache Ivy
を使用してみました。
Apache Ivy について
Apache Ivy は、Java プロジェクトの依存関係管理ツールです。
Maven のような機能を持ちながら、Ant と統合されることを前提として設計されています。
シンプルな XML ファイルを使って依存関係を定義し、それを自動的にダウンロード・管理してくれるため、手動でライブラリを管理する手間が省けます。
公式
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