Service Builderについて調べたのでメモ

Liferayってなんでこんなに日本語の情報が少ないの!? LiferayのService Builderについてちょっと調べたのでメモっておきます。

Service Builderとは?

Liferayが提供している開発ツールです。DBテーブルに対応するエンティティの情報からモデル、サービス層、パーシステンス層のコードを自動生成するツールです*1

どこで手に入るの?

簡単な使い方

Liferay Plugin SDKからポートレットを作れば簡単に使えますんでその手順を紹介。Liferayはインストール済みであることが前提です。

  • Liferay Plugin SDKを解凍し任意のディレクトリに配置する
  • "SDK/build.properties"を開き、app.server.dirにLiferay本体のパスを設定する。例えばTomcatバンドル版の場合は以下ような設定にする。
    app.server.type=tomcat
    app.server.dir=/Applications/liferay/liferay-portal-6.0.6/tomcat-6.0.29
  • (Macの場合)Terminalを開き、カレントディレクトリをSDK/portletsにする。create.shに実行権限を与えておく。
  • 以下のようにcreate.shを実行し、ポートレットプロジェクトの雛形を生成する。引数にはポートレットIDとポートレット表示名を指定する。
./create.sh sample "Sample Portlet"
  • 上記の場合は、sample-portletというディレクトリが生成される。そこにカレントディレクトリを移す。
  • "sample-portlet/docroot/WEB-INF/service.xml"を新規作成する。ここに生成の元ネタとなるエンティティ情報を記述します。なお、type属性の値が"long"とか"string"みたいに先頭小文字だと謎のエラーに出るので要注意
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE service-builder PUBLIC
        "-//Liferay//DTD Service Builder 6.0.0//EN"
        "http://www.liferay.com/dtd/liferay-service-builder_6_0_0.dtd">

<service-builder package-path='org.example.myservice'>
    <namespace>myservice</namespace>

    <entity name='Item' local-service='true' remote-service='false'>
        <column name='itemid' type='Long' primary='true'/>

        <column name="productid" type="String" />
        <column name="name" type="String" />
        <column name="description" type="String" />
        <column name="imageurl" type="String" />
        <column name="imagethumburl" type="String" />
        <column name="price" type="Double" />
    </entity>

</service-builder>
  • service.xmlを作成すれば、後はAntで"build-service"ターゲットを実行します。
ant build-service

これでわらわらとソースファイルや設定ファイルが生成されます。なお、自動生成されたソースは○○Impl.javaを除いて直接編集はしてはいけないようです。service.xmlの変更後の再作成でコンフリクトしてしまうからですね。生成されるのは、Javaソース以外に各種XML(SpringのBean定義、Hibernateのマッピング定義など)のようです。
個人的には、ちょっと過剰に自動生成しすぎじゃないかなぁ〜という印象。未だにSpringやHibernateでXML使うというのも正直残念。LiferayはSSHが流行ったときに作られて、そのアーキテクチャを引きずっているんだなぁという感じですね。

*1:個人的にはこの手の自動生成ツールを使って開発はしたくない...