garbagetown

個人の日記です

maven で s2jdbc-gen

日を追う毎に身も心も懐も寂しさが増す年の瀬にデータベース接続を行う場合、hibernateibatis なんぞ使ってしまった日には、あまりの面倒くささにウンザリして新年を迎えずに首を吊る、なんてことになり兼ねないわけで、ここはやはり s2jdbc を使い、暗い日本の将来にもほんの僅か一片の希望らしきものなどを見出したいと思うわけです。

s2jdbc-gen

s2jdbc には s2jdbc-gen というジェネレータが用意されており、これを ant から実行することでテーブル定義から entity を自動生成することができます。
s2jdbc は public フィールドに対応しているので、単純な entity なら手動で作ることも比較的容易ですが、entity 同士に多重度関連がある場合、よほどの達人でない限りスラスラとアノテーションを指定する事は難しく、s2jdbc-gen の利用は必須となります。

絶望

cubby ラヴであり maven ラヴであるド変態は、常に mvn archetype:generate で開発をスタートするので、クラスライブラリは全て maven リポジトリにあり、WEB-INF/lib や lib ディレクトリは空っぽです。
この状態では s2jdbc-gen のドキュメント にあるようなクラスパスの指定は行えません。
まさか maven リポジトリのフルパスを指定するわけにもいかず、maven を諦めるか s2jdbc-gen を諦めるか二つに一つ、やはり日本にはもう希望など残されていないのでしょうか。

希望

途方に暮れていたら耳寄り情報キャッチ!maven-antrun-plugin を利用すると、ant に maven のクラスパスを渡すことができるらしいじゃないですか。
ブラボー!ハラショー!maven-antrun-plugin 開発者えらい!開発者エロい!
早速使ってみました。

pom.xml

pom.xmlmaven-antrun-plugin の設定を追加します。
ant への依存性と s2jdbc-gen-build.xml へのパスを指定し、実行するターゲット名は環境変数として受け取れるよう設定します。
また、s2jdbc-gen-build.xml にて maven クラスパスを参照できるよう、inheritRefs 属性に true を指定します。

(snip)
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <dependencies>
                    <dependency>
                        <groupId>org.apache.ant</groupId>
                        <artifactId>ant</artifactId>
                        <version>1.7.0</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <tasks>
                        <ant antfile="${basedir}/s2jdbc-gen-build.xml" inheritRefs="true">
                            <target name="${ant.target}" />
                        </ant>
                    </tasks>
                </configuration>
                <goals>
                    <goal>run</goal>
                </goals>
            </plugin>
        </plugins>
    </build>
(snip)

s2jdbc-gen そのものへの依存性も忘れずに追加します。ぼくが親切にこういうことを書くときは、忘れて痛い目を見たときです。

(snip)
        <dependency>
            <groupId>org.seasar.container</groupId>
            <artifactId>s2jdbc-gen</artifactId>
            <version>2.4.40</version>
        </dependency>
    </dependencies>
(snip)
s2jdbc-gen-build.xml

pom.xml と同様に、プロジェクトディレクトリ直下に s2jdbc-gen-build.xml を以下の内容で作成します。
taskdef では、maven クラスパスから s2jdbc-gen-task.properties を探してタスク定義として読み込むよう指定しています。

<?xml version="1.0"?>
<project name="s2jdbc-gen">
    <target name="init">
        <property name="version" value="latest" />
        <property name="classpathdir" value="target/classes" />
        <property name="rootpackagename" value="org.garbagetown.test" />
        <property name="entitypackagename" value="entity" />
        <property name="javafiledestdir" value="src/main/java" />
        <property name="testjavafiledestdir" value="src/test/java" />
        <property name="javafileencoding" value="UTF-8" />
        <property name="env" value="ut" />
        <property name="jdbcmanagername" value="jdbcManager" />
        <taskdef
            resource="s2jdbc-gen-task.properties"
            classpathref="maven.runtime.classpath"/>
    </target>
    <target name="gen-entity" depends="init">
        <gen-entity
            rootpackagename="${rootpackagename}"
            entitypackagename="${entitypackagename}"
            javafiledestdir="${javafiledestdir}"
            javafileencoding="${javafileencoding}"
            env="${env}"
            jdbcmanagername="${jdbcmanagername}"
            classpathref="maven.runtime.classpath" />
    </target>
</project>

同様にして gen-service タスクや gen-names タスクを追加することができます。
コアタスク、オプションタスクの一覧は s2jdbc-gen のドキュメント に記載されています。

実行

jdbc.dicon, s2jdbc.dicon にデータベース接続情報を設定したら、コマンドプロンプトより mvn antrun:run を実行します。

mvn antrun:run -Dant.target=gen-entity

ありがとう、エロい人。