先日の積み残しに対して、「これだったら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宣言そのものを削除する必要がある。