ひ孫

犬のこととか書いていきたい

ant初心者がivyでjarファイルの依存関係をなんとかしたい

npmの依存関係の解決とかを覚えてからJavaを触ってjarの依存関係って何とかならんのかねェ ってのを調べてみた。

すると出てきたやり方は3つ * maven * ivy (+ ant) * gradle

調べるとmavenはあまり良い評判が見られなかったので却下。

残るはgradleとivyでgradle。新規で始めるならこれでもよさそうだけど今回は既にantがあるのでivyを選んだ

公式のQuick startと結構まんまになってしまいそうだけどさらっとまとめる

ivy.xmlを書く

mavenリポジトリから探してこんな感じivy.xmlファイルを書く。

ivy.xml

<ivy-module version="2.0">
    <info organisation="myproject" module="mymodule"/>
    <dependencies>
       <dependency org="com.google.android"
        name="android" rev="4.1.1.4" conf="default->master"/>
    </dependencies>
</ivy-module>

mavenリポジトリからコピーするとついてこないのだがconf="default->master"という記述が無いとjavadocやsourceまで落とそうとする。後述のantで解決しようとした時に「Multiple artifacts of the module」みたいなエラーがでたらこれが原因。

ant タスクを追加

まず全体はこんな感じ

build.xml

<?xml version="1.0" encoding="UTF-8"  ?>
<project basedir="." xmlns:ivy="antlib:org.apache.ivy.ant">
    <property name="ivy.install.version" value="2.1.0-rc2" />
    <property name="ivy.jar.dir" value="./lib" />
    <property name="ivy.jar.file" value="${ivy.jar.dir}/ivy.jar" />
    <path id="ivy.lib.path">
        <fileset dir="${ivy.jar.dir}" includes="*.jar"/>
    </path>

    <target name="download-ivy" unless="offline">
        <mkdir dir="${ivy.jar.dir}"/>
        <get src="http://repo2.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar"
             dest="${ivy.jar.file}" usetimestamp="true"/>
    </target>
    <target name="resolve" depends="download-ivy">
        <taskdef resource="org/apache/ivy/ant/antlib.xml"
                 uri="antlib:org.apache.ivy.ant" 
                 classpathref="ivy.lib.path"/>
        <ivy:retrieve pattern="${ivy.jar.dir}/[artifact].[ext]"/>

    </target>
</project>

公式サイトにのっているのを簡略化している。

基本的な部分

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

にてivy用のxmlnsを追加。*1

ivy用の設定

    <property name="ivy.install.version" value="2.1.0-rc2" />
    <property name="ivy.jar.dir" value="./lib" />
    <property name="ivy.jar.file" value="${ivy.jar.dir}/ivy.jar" />
    
    <path id="ivy.lib.path">
        <fileset dir="${ivy.jar.dir}" includes="*.jar"/>
    </path>

ivyを落としてくる場所を設定。このあたりは公式より簡略化している。

download-ivy タスク設定

    <target name="download-ivy" unless="offline">
        <mkdir dir="${ivy.jar.dir}"/>
        <get src="http://repo2.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar"
             dest="${ivy.jar.file}" usetimestamp="true"/>
    </target>

getなんてのを初めて知ったけどこれで落とせるようなので設定。

resolve タスク設定

    <target name="resolve" depends="download-ivy">
        <taskdef resource="org/apache/ivy/ant/antlib.xml"
                 uri="antlib:org.apache.ivy.ant" classpathref="ivy.lib.path"/>
        <ivy:retrieve pattern="${ivy.jar.dir}/[artifact].[ext]"/>
    </target>

先にivy.jarが必要なのでdepends=download-ivyとしている。 <ivy:retrieve pattern="${ivy.jar.dir}/[artifact].[ext]"/>は結構色々やり方がある模様だけど未検証

実行

resolveタスクさえ実行すればよいので

$ant resolve

これで上記のxmlであればlibディレクトリにぐんぐんファイルが落とされてくれるので幸せです。

Intellijだとプラグインでやるようなやり方もありますが、Intellijは標準でant実行機能ついているのでそっちでそのまま走らせてしまうほうが最終的には楽な気がします *2

*1:intellijでなぜか警告されてしまう・・・

*2:Intellijのプラグインは何度かEvent logにエラー出てはまりどころ多し