XMLBeansのAntタスクが.xsdconfigを読んでくれない件

XMLドキュメントの生成と読み込み処理を、DOMをちくちく叩いて作るのが面倒だったので、XMLBeansを使ってみることにした。XML Schemaを作りさえすれば、そいつと対応したJavaクラス群を自動生成したうえ、クラス群とXML文書間のデータの受け渡しを仲介してくれるという、大変便利な代物だ。

しかし、Antを利用してXML Schemaからクラスを生成する際に大ハマりしてしまった。

マニュアルによると、次のように定義すればよい。

<property name="xmlbeans.home" location="/path/to/xmlbeans"/>

<path id="xmlbeans.classpath">
    <fileset dir="${xmlbeans.home}/lib" includes="**/*.jar"/>
</path>

<taskdef name="xmlbean"
     classname="org.apache.xmlbeans.impl.tool.XMLBean"
     classpathref="xmlbeans.classpath" />

<xmlbean schema="schemas/myschema.xsd" destfile="myschema.jar"
    classpathref="xmlbeans.classpath"  />

これはちゃんと動くのだが、XMLBeansは生成したクラスのパッケージをデフォルトパッケージにしてしまう。それでは困るので、自分の望むパッケージにしたい。

調べてみると、FAQにズバリそのものの項目があった。

You can create a file that ends in .xsdconfig to map targetnamespace to packagename. Put the .xsdconfig file in the same directory as the .xsd that you are compiling.

http://wiki.apache.org/xmlbeans/XmlBeansFaq#configPackageName

.xsdconfigで終わる名称のファイルを作って、次のような中身にしてスキーマと同じディレクトリに置けば変更できるらしい。

<xb:config xmlns:xb="http://xml.apache.org/xmlbeans/2004/02/xbean/config">

  <!-- uriはスキーマに定義したTargetNamespace -->
  <xb:namespace uri="http://www.idesaku.com/myapp">
    <xb:package>com.gmail.idesaku.myapp.xmltypes</xb:package>
  </xb:namespace>
  
</xb:config>

これにより、スキーマから生成される全てのクラスはcom.gmail.idesaku.myapp.xmltypesパッケージとなる…はずなのだが、ちっともそうならない。ちなみに、scompというXMLBeans付属のコマンドラインツールを使うと、ちゃんとパッケージが変更される。つまり、xsdconfigファイルの記述は正しい。

わざとxsdconfigのフォーマットを壊してみても、生成に成功してしまう(もちろん、パッケージは変わらず)。どうやら読み込んでいないらしい。しかし、FAQには「スキーマと同じディレクトリに置け」としか書かれていない。Antタスクには、xsdconfigファイルを指定する属性が存在しない。いやもう、どうしろと。

半日以上かけて、やっとこちらのログを見つけた。同様の件で悩んでいる人への回答。

I've had the *.xsd and *.xsdconfig files picked up by passing a *directory* to the "schema" attribute on the task.

Re: newbie question oncerning ant task for xmlbeans

schema属性に「ディレクトリ」を渡してやったら読み込んだよ、とのこと。つまり…。

<xmlbean schema="schemas" destfile="myschema.jar"
    classpathref="xmlbeans.classpath"  />

こういうことか。

結果、ちゃんとパッケージ名が変わった。よくよくマニュアルのサンプルを見直してみると、たしかにディレクトリ名らしきものが渡されているな。

つまり、スキーマファイルと同様の手段でxsdconfigも食わせてやらねばならんのか。それじゃ、こうでもOKか。

<xmlbean destfile="myschema.jar"
    classpathref="xmlbeans.classpath">
    <fileset dir="schemas">
        <include name="**/*.xsd"/>
        <include name="**/*.xsdconfig"/>
    </fileset>
</xmlbean>

うん、うまくいく。

っていうか、FAQ!同じディレクトリかどうかは全然関係ないじゃねーか!余計なこと書くなよ!推奨構成ならそうだとちゃんと書けよ!いや、それよりもパッケージ名を任意のものに変更するなんてあまりにありがちな要求なのに、実現手段がわかりづらすぎだろう!