2011年6月5日日曜日

Apache AntのインストーラーをApache Antでビルドする

先日作ったApache Antのインストーラーに問題があることがわかった。このインストーラーをオフラインな環境で実行すると、下記のエラーが発生してしまう。

Errornull at line 3, column 79 : javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: github.com

どうやら、インストール定義ファイルの外部DTD (registry.dtd) にアクセスできずに困っている模様。インストール定義ファイルはコンパイル時にすべて処理されるものだとばかり思っていたが、レジストリ関連のものはそうではないらしい……

対策を練る

このエラーは、インストール定義ファイルからDOCTYPE宣言を削除すれば発生しなくなる。が、アプリケーションの都合に合わせてデータを改変するのは極力避けたい。しばらく考えた結果、

  1. インストール定義ファイルには手を入れない (=DOCTYPE宣言を残しておく)
  2. コンパイル時に、1のファイルからDOCTYPE宣言を削除したものを生成し、それをコンパイルする

ことにした。

というわけで、まずは先日のインストーラー作成プロセスをビルドスクリプト化するところから。

ビルドスクリプトを作る

インストール定義ファイルのコンパイル処理だけをビルドスクリプトに、というのでもよかったのだが、せっかくなので、

  • 入手したバイナリディストリビューションを展開する
  • インストーラーの名前をバイナリディストリビューションの名前にそろえる

ということも併せてやってみる。

フォルダ構成

入手したApache Ant 1.8.2のバイナリディストリビューション (apache-ant-1.8.2-bin.zip) を、展開せずにtarget/distに格納しておく。このバイナリディストリビューションがbuild/distに展開され、それを取り込んだインストーラーがtarget/installerに生成される。

2011-06-05/
  +-- build.xml           // ビルドスクリプト
  +-- install.xml
  +-- registry-spec.xml
  +-- build/
  |     +-- dist/         // ここにバイナリディストリビューションが展開される
  |           +-- bin/
  |           +-- lib/
  |           +-- docs/
  |           +-- etc/
  +-- target/
        +-- dist/         // ここにバイナリディストリビューションを格納しておく
        |     +-- apache-ant-1.8.2-bin.zip
        +-- installer/    // ここにインストーラーが生成される
              +-- apache-ant-1.8.2-installer.jar

ビルドスクリプト (build.xml)

ビルドスクリプトは、下記のターゲットを持つ。

  • installer: インストーラーを作成する
  • -dist.build.from-target: (ZIPアーカイブを展開することで) バイナリディストリビューションの内容を生成する

インストーラーの作成には、IzPackに同梱のカスタムタスクを使う。また、下記のプロパティをインストール定義ファイルへ受け渡すようにした。

  • dist.name: バイナリディストリビューションの名前
  • dist.build.dir: バイナリディストリビューションの展開先
build.xml
<?xml version="1.0" encoding="UTF-8"?>

<project name="Apache Ant"
  default="installer"
  basedir="."
  xmlns:izpack="com.izforge.izpack">

  <!--==== Properties ======================================================-->

  <property environment="env"/>

  <property name="dist.name"
    value="apache-ant-1.8.2"/>

  <property name="build.dir"
    location="./build/"/>
  <property name="target.dir"
    location="./target/"/>

  <property name="dist.build.dir"
    location="${build.dir}/dist/"/>
  <property name="dist.target.dir"
    location="${target.dir}/dist/"/>

  <!--==== Task definitions ================================================-->

  <taskdef name="compile" uri="com.izforge.izpack"
    description="インストール定義ファイルをコンパイルします。"
    classname="com.izforge.izpack.ant.IzPackTask">
    <classpath>
      <pathelement location="${env.IZPACK_HOME}/lib/standalone-compiler.jar"/>
    </classpath>
  </taskdef>

  <!--==== Targets =========================================================-->

  <target name="installer"
    description="インストーラーを作成します。"
    depends="-dist.build.from-target">
    <local name="installer.target.dir"/>
    <property name="installer.target.dir"
      location="${target.dir}/installer/"/>

    <mkdir dir="${installer.target.dir}"/>

    <izpack:compile
      input="./install.xml"
      output="${installer.target.dir}/${dist.name}-installer.jar"
      basedir="."
      inheritall="false">
      <propertyset>
        <propertyref name="dist.name"/>
        <propertyref name="dist.build.dir"/>
      </propertyset>
    </izpack:compile>
  </target>

  <target name="-dist.build.from-target">
    <mkdir dir="${dist.build.dir}"/>

    <unzip dest="${dist.build.dir}">
      <fileset dir="${dist.target.dir}">
        <include name="${dist.name}-bin.zip"/>
      </fileset>
      <cutdirsmapper dirs="1"/>
    </unzip>
  </target>

</project>

インストール定義ファイル (install.xml)

インストール定義ファイルは、先日作ったものを一部手直しして使う。具体的には、ビルドスクリプトから受け取った下記のプロパティを参照するように書き換えた。

  • dist.name: バイナリディストリビューションの名前
  • dist.build.dir: バイナリディストリビューションの展開先
install.xml
  <info>
    <appname>Apache Ant™</appname>
    <appversion>1.8.2</appversion>
    <appsubpath>Apache Software Foundation/@{dist.name}</appsubpath>
  </info>
    <pack name="All files"
      required="yes">
      <description/>
      <fileset targetdir="${INSTALL_PATH}"
        dir="@{dist.build.dir}"/>
    </pack>

ビルドスクリプトを実行する

ビルドスクリプトの実行は、Mac OS X環境とWindows環境とのどちらででも行える。ビルドが完了すると、インストーラーがtarget/installerに生成される。

Mac OS X環境
$ pwd
/Users/(中略)/2011-06-05
$ export IZPACK_HOME=/Applications/IzPack
$ ant
Windows環境
C:\>cd
C:\Documents and Settings\(中略)\2011-06-05
C:\>SET IZPACK_HOME=%ProgramFiles%\IzPack
C:\>ant

準備が整ったので、次はインストール定義ファイルの加工に取り組もう。

0 件のコメント:

コメントを投稿