作成 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は何?)。