2008年6月29日日曜日

IvyはMavenアレルギーの特効薬かもしれない

Apache AntプロジェクトにIvyというものが統合されるらしい。

IvyはMaven2のライブラリ依存関係の解決部分だけを抜き出したようなもの。Ivyの特徴は

  • Maven2のリポジトリが使える
  • ライブラリのJarはプロジェクトのlibディレクトリにコピーされる
  • Antタスクのひとつとして実行されるので今まで作ったAntスクリプトが無駄にならない

MavenのようにすべてをMavenにあわせてプロジェクトを作る必要がないので自由度が高い。

参考記事

万人のためのオートメーション: Ivy による依存関係の管理



2008年6月22日日曜日

Joda Time

Javaの日付ライブラリ。JSR310はこれを参考にしているらしい。

ISO8601形式の文字列とDateTimeオブジェクトの相互変換

DateTimeFormatter fmt = ISODateTimeFormat.dateTime();

パース

DateTime dt = fmt.parseDateTime(strInputDateTime);

文字列にするときは

String strOutputDateTime = fmt.print(dt);



2008年6月10日火曜日

EJB3.0のセッションBeanをJNDIで取得する方法

ここにいろいろ書いてある
https://glassfish.dev.java.net/javaee5/ejb/EJB_FAQ.html


ローカルEJBの場合

クライアントコンテナがインジェクションしてくれる場合、@EJBアノテーションを書く。@EJBのname属性は<ejb-ref-name>に相当。指定しなければルールに従って自動的につけられる。

@EJB(beanInterface=FooLocal.class)

Webフレームワークなどを使っていてServletに自分のアノテーションをつけられない場合はweb.xmlで参照名の定義をする。

<ejb-local-ref>
    <ejb-ref-name>ejb/fooejb</ejb-ref-name>
    <local>abc.def.FooLocal</local> <!-- ローカルインターフェイスの完全修飾名 -->
    <ejb-link>FooBean</ejb-link> <!-- EJBのJNDI名 -->
</ejb-local-ref>

Contextから取得

InitialContext ctx = new InitialContext();
FooLocal foo = (FooLocal)ctx.lookup("java:comp/env/ejb/fooejb");



リモートEJBの場合

クライアントコンテナを使う場合は@EJBアノテーションでインジェクションされる

@EJB(beanInterface=FooRemote.class)

クライアントコンテナを使わない場合JNDIから自前でルックアップする。

props = JNDIリモート参照の設定。後述。
InitialContext ctx = new InitialContext(props);
FooRemote foo = (FooRemote)ctx.lookup("com.example.FooRemote");

JNDIの設定

クラスパスにjndi.propertiesファイルを含めるか、InitialContextの引数にPropertiesを渡す。また、クライアント側プログラムのCLASSPATHにサーバ製品に対応するライブラリを含める。

設定するプロパティ

GrassFishの場合

org.omg.CORBA.ORBInitialHost=hostname
org.omg.CORBA.ORBInitialPort=3700
ホスト、ポートのデフォルトはlocalhost:3700

ライブラリ

appserv-rt.jar
javaee.jar

CLASSPATHに明示的に書く場合は上記の2つだけでいいが、appserv-rt.jarのMANAFEST.MFでさらに以下のファイルが指定されているのでappserv-rt.jarと同じディレクトリに入れておく

appserv-ext.jar
appserv-deployment-client.jar
jmxremote_optional.jar
appserv-rt_ja.jar
appserv-rt_zh.jar
appserv-rt_fr.jar
appserv-rt_de.jar
appserv-rt_es.jar
appserv-rt_it.jar
appserv-rt_sw.jar
appserv-rt_ko.jar
appserv-rt_zh_TW.jar
appserv-rt_zh_CN.jar


JNDI名の定義

EJB3.0のデフォルトのJNDI名はリモートインターフェイスの完全修飾名。
JNDI名を指定する場合は@Stateless, @Statefullの引数に書く
@Stateless(mappedName="FooEJB")

参考記事

Java EE 5チュートリアル:EJB3 セッション・ビーン編(2) 〜EJBクライアント〜