この Web サイトの XML ニュースグループやメーリング・リスト、ディスカッション・フォーラム (これらへのリンクを「参考文献」に挙げてあります) で最もよく取り上げられる話題が、データ・バインディングです。Java 開発者と XML 開発者は、Java オブジェクトと XML 文書との間で変換を行うための、そして Java オブジェクトに逆変換するための簡単な方法を熱望しています。
Sun は JAXB (Java Architecture for XML Binding) によって、この領域で優位を保っています。(みなさんの中には JAXB という頭字語が他のものを表すために使われているのを見た人がいるかもしれませんが、気にする必要はありません。Sun は 1 年位ごとに JAXB が何を表すのかを変更しているようです。) しかし JAXB の API (あるいはアーキテクチャー) はいくつか欠陥を持っており、しかもあまり頻繁には更新されません。また、一般的な要求である、リレーショナル・データベースへのマッピング処理をすることもできません。
ここに Castor が登場します。Castor はオープンソースのフレームワークとして、JAXB が対応していない多くのケースに対応しています。Castor はだいぶ前に登場し、JAXB のコード・ベースや Sun のデータ・バインディング仕様よりも以前からあります。実際、Castor は JAXB によるデータ・バインディングの方法で動作するように更新されており、JAXB に不満を持つプログラマーは最小限の手間でコードを移行することができます。
Castor のインストール方法と使い方の詳細に入いる前に、なぜ少なくとも Castor を試す必要があり、また JAXB から Castor への切り替えを検討する必要があるのか、その理由を挙げてみることにしましょう。
- 第 1 に、Castor は、ほとんどそのままで JAXB を置き換えることができます。言い換えると、すべての JAXB コードを、ほとんど苦労なく Castor に変更することができます。(これは正確には完全な置き換えではありませんが、ほとんど完全に近い置き換えであり、たとえ不慣れな新人プログラマーにとっても作業は簡単です。)
- 第 2 に、Castor はデータ・バインディングの領域で、JAXB よりもはるかに多くの機能を提供しています。スキーマなしに Java と XML との間で変換を行うことができ、バインディング・スキーマは JAXB よりも使いやすく、またリレーショナル・データベースから、そして XML 文書からのマーシャル機能とアンマーシャル機能を持っています。
- また、Castor は JDO 機能も持っています。JDO は Java Data Object を表し、Java と RDBMS との間でのマーシャリングとアンマーシャリングを実現するためのベースとなる技術です。JDO は数年前ほどの人気はなくなりましたが、やはり持っていると便利な機能です。さらに、JDO も Sun の仕様なので、あいまいな API に対してコードを書く必要がありません。
Castor のインストール手順は単純です。まず、Castor の Web サイト (「参考文献」にリンクがあります) を訪れ、左側のメニューの Download をクリックします。Latest Milestone Release を選択し、Download sets まで下にスクロールします。Castor の JAR や DTD、doc、依存ファイルなどをそれぞれ単体でダウンロードすることもできますが、事前にパッケージされたダウンロード・セットの 1 つを使う方法が最も簡単です (図 1)。
図 1. Castor の Web サイトの Download sets
この記事ではバージョン 1.1.2.1 を使います。私は The Castor JARs, docs, DTDs, command line tools, and examples というダウンロード・セットの ZIP 形式を選択しました。アーカイブを取得したら展開します。この中には、いくつかの JAR ファイルと doc、そしてサンプル・プログラムが含まれています (図 2)。
図 2. Castor のアーカイブを展開した様子
次に、Java 環境から Castor のファイルにアクセスできるように、Castor のすべてのファイルをシステム上の適切な場所に配置する必要があります。
ここで、サードパーティーの Java ライブラリーすべてに対する共通の場所を決めるように、強くお勧めします。これらのライブラリーをシステムのあちこちに分散して配置することもできますが、そうすると下記のように悪夢のような事態が発生します。
- ごく普通の意味から、必要なライブラリーを見つけにくくなります。
- システム上のさまざまな場所に複数のバージョンが置かれることになりがちなため、どのバージョンのライブラリーを使用しているのか判断しにくくなります。
- クラスパスが長く複雑になり、わけがわからなくなります。
私は /usr/local/java/ の下に各ライブラリー専用のサブディレクトリーを作って (通常はバージョン番号を付けて)、そこにすべてのライブラリーを置いています。そこでみなさんの場合も、(展開した) Castor アーカイブをライブラリー用の共通の場所に移動します。私の場合、Castor への完全なパスは /usr/local/java/castor-1.1.2.1 となります。
システム上で Java ライブラリーを使えるようにする、もう 1 つのステップとして、ドキュメンテーションを見つけてリンクします。ドキュメンテーションは繰り返し参照することになるため、大部分の Java ライブラリーは、(JavaDoc を含めて) ドキュメンテーションのローカル・コピーを HTML フォーマットで同梱しています。Castor の場合、ドキュメンテーションは castor-1.1.2.1/doc/ にあります。そこで私のシステムでは、/usr/local/java/castor-1.1.2.1/doc/index.html にブックマークを追加しました。図 3 は、ローカルにロードされた、バージョン 1.1.2.1 の Castor 用のドキュメンテーションを表示した様子です。
図 3. ローカルにロードされた Castor のドキュメンテーション
この記事で、そしてみなさんのプログラミング・ライフの中で、ドキュメンテーションに関して時間とスペースを費やして説明する大きな理由は、下記の 2 つです。
- このドキュメンテーションはローカルです。皆さんは飛行機の中でプログラミングをしたことがあるでしょうか。ネットワーク接続が失われたことはありませんか。スターバックスの WiFi にログインできなかったことはありませんか。こうした場合にローカルのドキュメンテーションは非常に役立ち、しかもアクセスは高速です。
- このドキュメンテーションは、使用しているライブラリーのバージョンと必ず一致します。Castor が進化するのに伴って、すべての人が必ず最新リリースをダウンロードするとは限りません。オンライン・ドキュメンテーションを使うということは、おそらく最新バージョンのドキュメンテーションを使うということですが、それが使用しているシステムのライブラリーのバージョンと一致するとは限りません。ローカルのドキュメンテーションを使う場合には、使用しているライブラリーのバージョンに正確に一致したドキュメンテーションで常に作業することができます。それによって、不適切な方法で機能を使おうとすることから生ずる、さらにはそのバージョンのライブラリーには存在しない機能を使おうとすることから生ずる、混乱や苛立ちを減らすことができます。
Castor には、下記のように依存ファイルがたくさんあります。
- Apache Ant
- Jakarta Commons
- JDBC 2.0 Standard Extensions
- Log4J ロギング・ユーティリティー
- Apache Xerces XML パーサー
Castor での大部分の操作にとって、これらは実際に最低限必要なものです。ソースから Castor をビルドする場合や、例を実行する場合、テストを使用する場合、あるいはさらに深いところにある Castor の機能を利用する場合には、さらに多くのものが必要になります。Castor を使う前に、これら依存ファイルをクラスパスに指定する必要があります。
力ずくで必要な依存ファイルを準備するには、Castor のダウンロード・ページを訪れ、必要な依存ファイルそれぞれのバージョンを書き留めます。次に各依存ファイルの Web サイトを訪れ、そのバージョンを見つけてダウンロードし、それをクラスパスに追加します。この方法はかなり時間がかかりますが、何でも自分でやりたい人には最適です。また、もしこうしたライブラリーの大部分が既に設定され、動作しているのであれば、この方法が有効かもしれません。
幸いなことに、もっと良い方法があります。Castor のダウンロード・ページに行き、安定したリリース (Stable Release) のダウンロード・セットである、Full SVN snapshot: All sources, docs, and 3rd party libraries (big) を見つけます。このセットはセット名の最後に「big」とついていますが、10 MB しかありません (DSL やケーブルなら、この程度はたいしたことはありません)。このファイルをダウンロードし、そして展開します (これは図 4 のようになります)。
図 4. Full SVN snapshot (展開した様子)
これで lib/ ディレクトリーを表示すると、大量の JAR ファイルが見つかります。これらが Castor が必要とするライブラリーです。
オリジナルの Castor ディストリビューションの中、あるいはその隣に新しいディレクトリーを作成し、今ダウンロードしたすべての JAR ファイルをそのディレクトリーに移動します。例えば下記のようになります。
[bmclaugh:~] cd /usr/local/java [bmclaugh:/usr/local/java] ls castor-1.1.2.1 xalan-j_2_7_0 [bmclaugh:/usr/local/java] cd castor-1.1.2.1/ [bmclaugh:/usr/local/java/castor-1.1.2.1] ls CHANGELOG castor-1.1.2.1.jar castor-1.1.2.1-anttasks.jar doc castor-1.1.2.1-codegen.jar jdbc-se2.0.jar castor-1.1.2.1-ddlgen.jar jta1.0.1.jar castor-1.1.2.1-jdo.jar schema castor-1.1.2.1-xml.jar [bmclaugh:/usr/local/java/castor-1.1.2.1] mkdir lib [bmclaugh:/usr/local/java/castor-1.1.2.1] cd lib [bmclaugh:/usr/local/java/castor-1.1.2.1/lib] cp ~/downloads/castor-1.1.2.1/lib/*.jar . [bmclaugh:/usr/local/java/castor-1.1.2.1/lib] |
ここでは Castor ディストリビューションの中に lib/ ディレクトリーを作成し、すべての JAR ファイルをそこに移動しています。これで Castor はそれらの JAR ファイルを使えるようになります。
今度は、クラスパスにあるすべてのものを設定する必要があります。私は Mac OS X の構成の .profile ファイルを使って、この問題のすべてを処理しています。皆さんもこれと同じようにプロファイルを設定するか、あるいは Windows の場合ではシステム環境変数を設定します。いずれにせよ、下記の JAR をクラスパスに追加する必要があります。
- (Castor のメイン・ディレクトリーに) castor-1.1.2.1.jar
- (Castor のメイン・ディレクトリーに) castor-1.1.2.1-xml.jar
- (Castor の依存ライブラリーを置いた場所に) xerces-J-1.4.0.jar
- (Castor の依存ライブラリーを置いた場所に) commons-logging-1.1.jar
参考までに、下記は私の .profile です。これを見ると私の設定がわかるはずです。
export JAVA_BASE=/usr/local/java
export JAVA_HOME=/Library/Java/Home
export XERCES_HOME=$JAVA_BASE/xerces-2_6_2
export XALAN_HOME=$JAVA_BASE/xalan-j_2_7_0
export CASTOR_HOME=$JAVA_BASE/castor-1.1.2.1
export EDITOR=vi
export CASTOR_CLASSES=$CASTOR_HOME/castor-1.1.2.1.jar:
$CASTOR_HOME/castor-1.1.2.1-xml.jar:
$CASTOR_HOME/lib/xerces-J_1.4.0.jar:
$CASTOR_HOME/lib/commons-logging-1.1.jar
export CVS_RSH=ssh
export PS1="[`whoami`:\w] "
export CLASSPATH=$XALAN_HOME/xalan.jar:$XALAN_HOME/xml-apis.jar:
$XALAN_HOME/xercesImpl.jar:
~/lib/mclaughlin-xml.jar:$CASTOR_CLASSES:.
|
これらがすべてクラスパスに入ったことを確認できると、簡単なテストを行うことができます。
非常に単純なクラスを作成しましょう。そして、そのクラスを XML に変換し、また Java に逆変換するユーティリティーを作成しましょう。これは Castor のすべての機能を示すものではなく、非常に基本的なテストにすぎません。リスト 1 は、これから使用する CD クラスを示しています。下記のソース・コードを入力し、CD.java として保存します (あるいは「参考文献」からコードをダウンロードします)。
リスト 1. (テスト用の) CD クラス
package ibm.xml.castor;
import java.util.ArrayList;
import java.util.List;
/** A class to represent CDs */
public class CD implements java.io.Serializable {
/** The name of the CD */
private String name = null;
/** The artist of the CD */
private String artist = null;
/** Track listings */
private List tracks = null;
/** Required no-args constructor */
public CD() {
super();
}
/** Create a new CD */
public CD(String name, String artist) {
super();
this.name = name;
this.artist = artist;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setArtist(String artist) {
this.artist = artist;
}
public String getArtist() {
return artist;
}
public void setTracks(List tracks) {
this.tracks = tracks;
}
public List getTracks() {
return tracks;
}
public void addTrack(String trackName) {
if (tracks == null) {
tracks = new ArrayList();
}
tracks.add(trackName);
}
}
|
今度は、マーシャリングを処理するクラスが必要です。これをリスト 2 に示します。
リスト 2. マーシャリングをテストするクラス
package ibm.xml.castor;
import java.io.FileWriter;
import org.exolab.castor.xml.Marshaller;
public class MarshalTester {
public static void main(String[] args) {
try {
CD sessions = new CD("Sessions for Robert J", "Eric Clapton");
sessions.addTrack("Little Queen of Spades");
sessions.addTrack("Terraplane Blues");
FileWriter writer = new FileWriter("cds.xml");
Marshaller.marshal(sessions, writer);
} catch (Exception e) {
System.err.println(e.getMessage());
e.printStackTrace(System.err);
}
}
}
|
そして、最後ですが重要なものとして、リスト 3 はアンマーシャリング用のクラスです。
リスト 3. アンマーシャリングをテストするクラス
package ibm.xml.castor;
import java.io.FileReader;
import java.util.Iterator;
import java.util.List;
import org.exolab.castor.xml.Unmarshaller;
public class UnmarshalTester {
public static void main(String[] args) {
try {
FileReader reader = new FileReader("cds.xml");
CD cd = (CD)Unmarshaller.unmarshal(CD.class, reader);
System.out.println("CD title: " + cd.getName());
System.out.println("CD artist: " + cd.getArtist());
List tracks = cd.getTracks();
if (tracks == null) {
System.out.println("No tracks.");
} else {
for (Iterator i = tracks.iterator(); i.hasNext(); ) {
System.out.println("Track: " + i.next());
}
}
} catch (Exception e) {
System.err.println(e.getMessage());
e.printStackTrace(System.err);
}
}
}
|
これらのクラスを下記のようにコンパイルします。
[bmclaugh:~/Documents/developerworks/castor] javac -d . *.java Note: CD.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. |
この警告は、Java 5 以上を使用している場合に CD.java 内でパラメーターとして指定された型を使っていないために出る警告ですが、問題にはならないので気にする必要はありません。では、マーシャラー・テスト・クラスを実行しましょう。
[bmclaugh:~/Documents/developerworks/castor] java ibm.xml.castor.MarshalTester |
これで、cds.xml を見つけて開くことができるはずです。これは下記のようなもののはずです。
<?xml version="1.0" encoding="UTF-8"?>
<CD>
<artist>Eric Clapton</artist>
<name>Sessions for Robert J</name>
<tracks xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="java:java.lang.String">Little Queen of Spades</tracks>
<tracks xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="java:java.lang.String">Terraplane Blues</tracks>
</CD>
|
これはあまり読みやすくありませんが、MarshalTester クラスで作成した CD の中のすべての情報が、この XML 文書でわかるはずです。
今度は、XML 文書から Java に逆変換できることを確認する必要があります。下記のアンマーシャリング・テスターを実行します。
[bmclaugh:~/Documents/developerworks/castor] java ibm.xml.castor.UnmarshalTester CD title: Sessions for Robert J CD artist: Eric Clapton Track: Little Queen of Spades Track: Terraplane Blues |
これは、見ればすぐにわかるでしょう。この出力が得られたら、Castor が XML ファイルを開き、それを Java クラスに戻します。
UnmarshalTester から同じ cds.xml と出力を取得できていれば、この時点でインストールは正常に動作しています。まだ Castor を使って特別に複雑なことは何もしていませんが、Castor が動作していること、JAR ファイルが適切に設定されていること、そして Castor が必要な動作を行えることは十分に確認できました。
この時点で、動作状態の Castor 環境が用意できました。さらにリスト 1、2、3 から、Castor の動作についての基本的な概念を理解できたはずです。マーシャリングとアンマーシャリングが行えるかどうか、みなさん自身で試してみてください。次回の記事では、Castor の XML 機能をさらに詳しく調べ、またマッピング・ファイルの使い方を調べることにします。それまで、Castor をいじって楽しんでください。
| 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|---|---|---|
| Java source code from this article | x-xjavacastor1/castor1_source_code.zip | 2KB | HTTP |
| Java compiled code from this article | x-xjavacastor1/castor1_compiled_code.zip | 3KB | HTTP |
学ぶために
- Castor のすべてを知るためのオンラインのハブ、Castor の Web サイトを訪れてください。
-
Castor のクラスの JavaDoc を読んでください。
- XML がまったく初めての人は、xml.com に用意されている、わかりやすく説明されたオンライン・リソースを利用して XML のすべてを学んでください。
- 古い記事ですが、developerWorks の「Castor JDOを始めよう」(Bruce Snyder 著、developerWorks、2002年8月) を読んでください。この言語の詳細に関する一部の説明は古くなっていますが、考え方は今でも適用できます。
- Sun のデータ・バインディング API、JAXB の詳細を説明したシリーズの入門記事「Practical Data Binding」(Brett McLaughlin、developerWorks、2004年5月) を読んでください。
- XML および関連技術において IBM 認証開発者になる方法については、IBM XML certification を参照してください。
- developerWorks の XML ゾーンは XML の技術ライブラリーとして、広範な話題を網羅した技術記事やヒント、チュートリアル、技術標準、IBM レッドブックなどを用意しています。
-
developerWorks technical events and webcasts で最新情報を入手してください。
-
Technology
bookstore には、この記事や他の技術的な話題に関する本が豊富に取り揃えられています。
製品や技術を入手するために
- 『Java and XML, Third Edition』(Brett McLaughlin と Justin Edelson の共著、O'Reilly Media, Inc. 刊) は、データ・バインディングやマッピングの詳細な説明を含めて、XML を最初から最後まで説明しています。
- 『Java
and XML Data Binding』(Brett McLaughlin 著、O'Reilly Media, Inc. 刊) は古い本ですが、Castor と、データ・バインディングに関係するさまざまな概念の詳細を解説しています。
- Castor に関する有料のサポートあるいはヘルプを求めている人は、Castor Professional Services を見てください。
- 皆さんの次期開発プロジェクトを IBM trial software を使って革新してください。developerWorks から直接ダウンロードすることができます。
議論するために
-
ディスカッション・フォーラムに参加してください。
-
XML zone discussion forums に参加してください。これらのフォーラムでは XML を中心に議論が行われています。
- この記事を読んだ後、developerWorks XML zone: Share your thoughts に皆さんのコメントや意見を投稿してください。XML ゾーンの編集者がこのフォーラムの司会をしており、皆さんからの意見を歓迎しています。
-
developerWorks blogs から developerWorks のコミュニティーに加わってください。

Brett McLaughlin は Logo の時代からコンピューターの仕事をしています (あの小さな三角形を覚えていますか)。最近では、彼は Java と XML のコミュニティーで最もよく知られた著作者兼プログラマーの 1 人になっています。彼は Nextel Communications and Allegiance Telecom, Inc. で複雑なエンタープライズ・システムの実装に携わり、Lutris Technologies では実際にアプリケーション・サーバーを作成し、そして最近では、O'Reilly Media, Inc. にて、重要な話題に関する本の執筆や編集を続けています。著書『Head Rush Ajax ― 学びながら読む Ajax 入門』では、賞を獲得した革新的な Head First 手法を Ajax に導入しています。『Java 5.0 Tiger』は、最新バージョンの Java 技術に関する最初の本でした。そして彼の古典作『Java & XML』は、Java 言語での XML 技術の使い方に関する決定作の地位を保っています。