2011年7月10日日曜日

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

先日の積み残しに対して、「これだったらXMLカタログを使えば楽勝だろう」と高をくくっていたところ、とんでもないワナが潜んでいた。頭の中で考えるのと実際に手を動かすのとではやっぱり違う、ということを改めて思い知らされた。

Apache Ant (Mac OS X同梱版) のワナ

Apache Antで外部XMLカタログファイルを使う場合、Apache XML Commons Resolverが必要になる[1]。具体的には、Apache Antの実行時クラスパスにApache XML Commons Resolverを含めてやる[2]必要があるのだが、Mac OS X同梱のApache Antではどういうわけかそれができなかった。

-libオプションで指定してみた
$ pwd
/Users/ (中略) /playpit/trunk/apache-ant
$ ant -lib /path/to/resolver.jar
CLASSPATH環境変数で指定してみた
$ pwd
/Users/ (中略) /playpit/trunk/apache-ant
$ export CLASSPATH=/path/to/resolver.jar
$ ant
${user.home}/.ant/libフォルダに格納してみた
$ pwd
/Users/ (中略) /playpit/trunk/apache-ant
$ ls ~/.ant/lib/
resolver.jar
$ ant

上記のいずれの方法でも、

Warning: XML resolver not found; external catalogs will be ignored

という警告が出て、オフラインでのXSLT変換に失敗してしまう。もちろん、バイナリディストリビューション版であれば問題なくビルドできる。

しばらくWebをさまよってみたもののそれらしい情報にはたどり着けず、やむなくMac OS X同梱版のApache Antを使うのは諦めることにした。

フォルダ構成

気を取り直して、XMLカタログおよびDTDファイルをビルドスクリプトに組み込む。XMLカタログは自作するとして、DTDファイルはIzPackに同梱されているものを使おう、と思ったのだが、どうやら最新版のIzPack (4.3.4) にはDTDファイルが同梱されていない模様。GitHubから入手してもよかったのだが、DTDバリデーションを行うわけではないのでダミーのDTDファイルで済ませることにする。

apache-ant/
  +-- build.xml
  +-- standalone.xsl
  +-- src/
  |     +-- installer/
  +-- lib/
  |     +-- izpack-4.3/
  |           +-- catalog.xml                 // XMLカタログファイル
  |           +-- dtd/
  |                 +-- installation.dtd      // ダミーのDTDファイル
  |                 +-- event/
  |                       +-- registry.dtd    // ダミーのDTDファイル
  +-- build/
  |     +-- dist/
  |     +-- installer/
  +-- target/
        +-- dist/
        +-- installer/

詳細は私的リポジトリを参照。

メモ: XMLカタログのバージョン

  • XMLカタログにはバージョン1.0と1.1とがある (できればバージョン1.1を使いたい)。
  • Apache XML Commons Resolver 1.2は、バージョン1.0と1.1 (の一部?) との両方のXMLカタログをサポートしている。
  • ただし、Apache XML Commons Resolver 1.2はバージョン1.1のXMLカタログをブートストラップできない。
  • バージョン1.1のXMLカタログを使いたい場合は、5.2. “Bootstrapping” Catalog Resolutionの解説に従ってDOCTYPE宣言のシステム識別子を書き換えるか、DOCTYPE宣言そのものを削除する必要がある。