XDoclet という Ant にプラグインして使用するユーティリティがあります。
XDoclet の内容については簡単な説明とサンプルの実行をこちらで見ていますので、とりあえずそちらを参照してみてください。ただし、今回は 1.2.0 のβ版を使用しました。
また、Ant の簡単な紹介を、こちらとこちらでしています。今回のこの記事は Ant の応用編の初級編ともなりますので、その続きとして XDoclet の使い方も見ていきたいと思います。。
Ant の簡単な紹介で使用した例をそのまま使って見ていきたいと思います。
まず、以前の build.xml の中に以下のように新しく XDoclet 用の Target を追加します。

以前「はじめての Session Bean」ということで使用した EJB インプリメンテーション Bean から、Home/Remote インターフェイスを生成してみましょう。
こちらが組み込んだ build.xml 全文になります。
<?xml version="1.0"?>
<project name="ejbdocletbuild" default="compile">
<property name="xdoclet.lib.dir" value="c:\XDoclet-1.2.0-beta1\lib"/>
<property name="log4j.lib.dir" value="c:\jakarta-cactus-13-1.4.1\lib"/>
<target name="init">
<mkdir dir="build/classes"/>
<mkdir dir="build/META-INF"/>
<mkdir dir="dist"/>
<mkdir dir="gen_src"/>
<echo>init complete!</echo>
</target>
<target name="compile" depends="init">
<javac srcdir="."
destdir="build/classes"
/>
<echo>compile complete!</echo>
</target>
<target name="archive" depends="compile">
<jar destfile="dist/project.jar"
basedir="build/classes"
/>
<echo>archive complete!</echo>
</target>
<target name="clean" depends="init">
<delete dir="build/classes"/>
<delete dir="build/META-INF"/>
<delete dir="dist"/>
<delete dir="gen_src"/>
<echo>delete complete!</echo>
</target>
<target name="ejbdoclet" depends="init">
<taskdef name="ejbdoclet" classname="xdoclet.modules.ejb.EjbDocletTask">
<classpath>
<fileset dir="${xdoclet.lib.dir}" includes="*.jar"/>
<fileset dir="${log4j.lib.dir}" includes="*.jar"/>
</classpath>
</taskdef>
<ejbdoclet destdir="gen_src" ejbspec="2.0">
<fileset dir=".">
<include name="**/*Bean.java" />
</fileset>
<remoteinterface/>
<localinterface/>
<homeinterface />
<localhomeinterface/>
<deploymentdescriptor
destdir="build/META-INF"
validatexml="true"
/>
</ejbdoclet>
<echo>EJB generation complete!</echo>
</target>
</project>
こちらがコメントを入れた EJB インプリメンテーション Bean のソースです。
コメントを追加しているだけですが、以前のものとちょっと見比べてみてください。
import java.rmi.RemoteException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import java.math.*;
// Public --------------------------------------------------------
/**
* Deposit money.
*
* @ejb:bean type="Stateless"
* jndi-name="ejb/SimpleConverter"
* local-jndi-name="ejb/SimpleConverterLocal"
* viewtype="both"
*/
public class ConverterBean implements SessionBean {
BigDecimal yenRate = new BigDecimal("121.6000");
BigDecimal euroRate = new BigDecimal("0.0077");
// Public --------------------------------------------------------
/**
* Convert Doller to Yen
*
* @ejb:interface-method
*/
public BigDecimal dollarToYen(BigDecimal dollars) {
BigDecimal result = dollars.multiply(yenRate);
return result.setScale(2,BigDecimal.ROUND_UP);
}
// Public --------------------------------------------------------
/**
* Convert Yen to Euro
*
* @ejb:interface-method
*/
public BigDecimal yenToEuro(BigDecimal yen) {
BigDecimal result = yen.multiply(euroRate);
return result.setScale(2,BigDecimal.ROUND_UP);
}
public ConverterBean() { }
public void ejbCreate() { }
public void ejbRemove() { }
public void ejbActivate() { }
public void ejbPassivate() { }
public void setSessionContext(SessionContext sc) { }
}
クラスの定義として、以下のように @ejb:bean でEJB のタイプや jndi名、Remote か Local か(これが"viewtype="で、"both"だと両方になります)などの指定を行います。
/*
* @ejb:bean type="Stateless"
* jndi-name="ejb/SimpleConverter"
* local-jndi-name="ejb/SimpleConverterLocal"
* viewtype="both"
*/
インターフェイスに公開するメソッドの前には @ejb:interface-method を指定します。
/*
* @ejb:interface-method
*/
ejbdoclet タスクを定義します。
<taskdef name="ejbdoclet" classname="xdoclet.modules.ejb.EjbDocletTask">
<classpath>
<fileset dir="${xdoclet.lib.dir}" includes="*.jar"/>
<fileset dir="${log4j.lib.dir}" includes="*.jar"/>
</classpath>
</taskdef>
クラスパスに xdoclet.jar と log4j.jar が最低限、入っている必要があります。
EJBDoclet タスクを実行するには j2ee.jar も必要になります。(この例では、システム環境に入ってしまっていたので抜けてますが
... )
<ejbdoclet destdir="gen_src" ejbspec="2.0">
<fileset dir=".">
<include name="**/*Bean.java" />
</fileset>
destdir は生成したソースを置く場所を指定しています。
次の fileset dir="." 〜 は Home インターフェイス等を生成させるもとの
Bean インプリメンテーションクラスのソースをどこから読んでくるか (この場合では
ConverterBean.java の在り処) を指定しています。include はその中の名前が
xxxBean.java となっているものを読み込むように、という指定になっています。
今回は違いをはっきりさせるために分けてみました。
どういうものを生成させるかを、タスクとして指定しています。
<remoteinterface/>
<localinterface/>
<homeinterface />
<localhomeinterface/>
<deploymentdescriptor
デプロイメント・ディスクリプターの生成の設定です。
生成したものの置き先と XML としてのチェックを指定しています。
<deploymentdescriptor
destdir="build/META-INF"
validatexml="true"
/>

ant ejbdoclet と実行して、ejbdoclet タスクの結果を見てみましょう。
以下のようにメッセージが出て、destdir で指定したディレクトリ (gen_src) に Home(Remote/Local) インターフェイスと Remote/Local インターフェイス、デプロイメント・ディスクリプタが生成されます。

生成されたファイルの例として、Remote インターフェイスになる Converter.java を見てみます。
以前のものとちょっと見比べてみてください。

|
|