作成 2003/11/26
JaxMeはJAXB(JSR-31)の実装です。Apache JaxMeプロジェクト(Apache WebServiceのサブプロジェクト)で開発されているオープンソースのプロダクトです。O/RマッピングやXMLデータバインディングが流行りらしいので、さわってみました。
http://ws.apache.org/jaxme/ あるいは、http://ws.apache.org/ のDownloadsからダウンロードします。ここでは、Incubated JaxMe Version0.2 Binaryをダウンロードしました。ダウンロードしたアーカイブを展開し、適当なディレクトリに配置します。
XMLスキーマ(*.xsd)をJavaソースに変換してみます。マニュアルを見ると簡単にやるには、JaxMeで提供されているAntタスクを利用するとのこと。こんな感じ。
<project name="hoge" default="genereate"> <path id="generate.class.path"> <fileset dir="lib"> <include name="*.jar"/> </fileset> </path> <taskdef name="xjc" classname="org.apache.ws.jaxme.generator.XJCTask" classpathref="generate.class.path"/> <target name="genereate"> <xjc schema="hoge.xsd" target="build/src" packageName="hoge"/> </target> </project>
jaxmeのlibディレクトリ以下のJARをクラスパスに指定して、xjcタスクを定義します。でもってxjc実行。マニュアルでは、出力パッケージ指定はpackageと書いていますが、現状、実装はpackageNameのようです。サンプルについているxsdは設定、環境の問題か分かりませんが、ジェネレートに失敗したので、超シンプルなxsdファイルを対象にジェネレートしました。
C:\app\incubated-jaxme-0.2>ant Buildfile: build.xml genereate: BUILD SUCCESSFUL Total time: 1 second
使ったXMLファイル
前JAXBの実験で使ったプログラムをそのまま流用。ちょっとだけ調整。
import hoge.Man; import java.io.FileInputStream; import java.math.BigDecimal; import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; public class XSDMain { public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance("hoge"); Unmarshaller u = jc.createUnmarshaller(); Man man = (Man) u.unmarshal(new FileInputStream("hoge.xml")); System.out.println(man.getName()); System.out.println(man.getAge()); man.setName("baba"); man.setAge(new BigDecimal("21")); Marshaller m = jc.createMarshaller(); m.marshal(man, System.out); System.out.println("END"); } }
実行結果
miya 10 <man> <name>baba</name> <age>21</age> </man>
Castor、XMLBeansなど、XMLバインディングツールはいろいろあるようですが、JaxMeは、、、JaxMeはどんな特徴があるんだろう。。。とりあえず、JAXB仕様に準拠して、オープンソースなところでしょうか。う〜む。まあ、名前がかわいいので、よしとしましょう。なお、名前の由来は、JAX○Eに、なんとなくMを入れてみたのが由来とのこと(FAQより。Eは何?)。