Skip to content

Instantly share code, notes, and snippets.

@wshino
Created July 10, 2013 05:13
Show Gist options
  • Save wshino/5963644 to your computer and use it in GitHub Desktop.
Save wshino/5963644 to your computer and use it in GitHub Desktop.

依存関係の解決に apache ivy を使う

恐怖、ビルドの仕組みがないプロジェクト

とあるJavaでできたバッチ処理プロジェクトがあったのだが今までビルドの仕組みがなかった。 開発者が各々開発環境のeclipseでビルドをして生成されたクラスファイルを本番サーバにscpしていた。 ちょっとこれは恐ろしいことなので、 レポジトリがCVSからGitに移行したタイミングで仕組みを変更することにした。

基本どの処理もcronで時間を指定してその中からJavaを実行するというものだった。 ディレクトリ構造を変更するのが負担になると考えたので、maven化はアウト。 ディレクトリ構造を現状の状態に保ったまま依存関係のあるjarをもってくることがやりたかったのでivyを採用。

mavenと比べてよかったところ

  1. 記述が少ない
  2. ディレクトリ構造が自由
  3. antの依存関係だけを解決する仕組みなので好きなターゲットを作成できる。
    というかんじ。

Jenkinsサーバの設定

どうせだからJenkinsにビルドとリリースをお任せする。
CentOSに標準のJenkins入れてant1.8が入っている状況だと
/usr/local/ant
がantのディレクトリなので
http://ant.apache.org/ivy/download.cgi
上記のページから適当なバイナリをダウンロードしてファイルを展開したらivy-*.jarを
/usr/local/ant/lib
配下に入れる。これでantからivyを呼ぶことができる。

使い方

サンプルの丸パクリだけどbuild.xmlに

    <project name="batch" default="compile" xmlns:ivy="antlib:org.apache.ivy.ant">

プロジェクト名をきめるところにxmlns:ivy=を記述する。

    <target name="resolve" description="--> retreive dependencies with ivy">
        <ivy:retrieve/>
    </target>

resolveってターゲットを作成して

    <target name="compile" depends="resolve" description="--> compile the project">
      ...
    </target>

こんなかんじで各ターゲットにdepends="resolve"と書いてあげるとターゲットが実行される際にivyの依存解決が動作する。 依存するモジュールはivy.xmlというファイルを作成して、中身を

    <ivy-module version="2.0">
        <info organisation="jp.ameba" module="official-batch"/>
        <dependencies>
            <dependency org="commons-codec" name="commons-codec" rev="1.3"/>
            <dependency org="commons-lang" name="commons-lang" rev="2.3"/>
            ...
        </dependencies>
    </ivy-module>

dependenciesの子にdependencyという要素を追記していく。 orgがmavenでいうところのgroupIdでnameがartifactId、revがversionに対応する。 今回のプロジェクトはSeasar2を使っていたので中央レポジトリ以外の箇所も見る必要がある。 そんなときはivysettings.xmlというファイルを作成して

    <ivysettings>
        <settings defaultResolver="chained"/>
        <resolvers>
            <chain name="chained" returnFirst="true">
                <ibiblio name="seasar" m2compatible="true" root="http://maven.seasar.org/maven2/" />
                <ibiblio name="ibiblio" m2compatible="true"/>
            </chain>
        </resolvers>
    </ivysettings>

resolvers->chain->ibiblioという要素を追記してあげるとそっちのレポジトリも見てくれる。

結論としてはmavenにするのはコストがかかるし、ダルいなというときに依存関係解決だけに機能をしぼってantとミックスして使うのはありだと思う。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment