久しぶりに時間が取れたので、先日の続きに取り組んでみる。ビルドプロセスをスクリプト化するところまではできたので、あとはインストール定義ファイルの加工処理を組み込めば完了、なはず。
DOCTYPE宣言の除去にXSLTを使う
やるべきことは、インストール定義ファイルからDOCTYPE宣言を除去すること。実現方法はいろいろありそうだが、
- XMLファイルをテキストファイルとして処理するのはちょっと……
- XML文書を加工するならXSLTでしょ
ということで、XSLTを使うことにした。
フォルダ構成
これまでインストール定義ファイルをプロジェクトフォルダのルートに格納していたが、これを機にsrc/installerに移す。このインストール定義ファイルがbuild/installerに複製/加工され、それをコンパイルすることでインストーラーが生成される。
2011-06-27/
+-- build.xml
+-- standalone.xsl // DOCTYPE宣言を除去するためのXSLTスタイルシート
+-- src/
| +-- installer/ // ここにインストール定義ファイルを格納しておく
| +-- install.xml
| +-- registry-spec.xml
+-- build/
| +-- dist/
| +-- installer/ // ここにインストール定義ファイルが複製/加工される
| +-- install.xml
| +-- registry-spec.xml
+-- target/
+-- dist/
+-- installer/
ビルドスクリプト (build.xml)
ビルドスクリプトは、先日作ったものを一部手直しして使う。具体的には下記のとおり。
- 非公開ターゲット
installer.buildを追加した。このターゲットは、インストール定義ファイルの複製/加工を行う。 izpack:compileタスク呼び出しを修正した。これまではプロジェクトフォルダのルートを起点としていたが、これをbuild/installerを起点とするよう変更した。
- 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="src.dir" location="./src/"/> <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/"/> <property name="installer.src.dir" location="${src.dir}/installer/"/> <property name="installer.build.dir" location="${build.dir}/installer/"/> <property name="installer.target.dir" location="${target.dir}/installer/"/> <!--==== 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, -installer.build"> <mkdir dir="${installer.target.dir}"/> <izpack:compile input="${installer.build.dir}/install.xml" output="${installer.target.dir}/${dist.name}-installer.jar" basedir="${installer.build.dir}" 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> <target name="-installer.build"> <mkdir dir="${installer.build.dir}"/> <xslt destdir="${installer.build.dir}" style="./standalone.xsl" basedir="${installer.src.dir}"> <identitymapper/> </xslt> </target> </project>
DOCTYPE宣言除去用のXSLTスタイルシート (standalone.xsl)
DOCTYPE宣言除去用のXSLTスタイルシートは、テンプレートルールを一つだけ持つ。このテンプレートルールは、ソースツリーをそのままリザルトツリーとして出力するだけのシンプルなもの。この過程で (幸か不幸か) DOCTYPE宣言は除去される。
- standalone.xsl
<?xml version="1.0" encoding="UTF-8"?> <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <xsl:copy-of select="child::node()"/> </xsl:template> </xsl:transform>
ビルドスクリプトを実行する
ビルドスクリプトの実行は、先日の方法とまったく同じ。ビルドが完了すると、インストーラーがtarget/installerに生成される。このインストーラーをオフラインな環境で実行しても、件のエラーは発生しない。
ただ残念なことに、このビルドスクリプトはオンラインな環境でしか実行できない。職場 (=オフラインな環境) で使えるようにするためにも、この点を何とかしなければ……
