読者です 読者をやめる 読者になる 読者になる

Java EE 事始め!

主にJava EEについて、つらつらとマイペースに書いていきます。「Java EEを勉強するときに、一番最初に読んでもらえるブログ」を目指して頑張ります!

Doma 2のエンティティ自動生成をNetBeans 8.0.1からAntで使う

Java Advent Calendar 2014、およびJava EE Advent Calendar 2014に登録しました。
Java Advent Calendar 2014 - Qiita
Java EE Advent Calendar 2014 - Qiita
JavaDoma 2について、Java EEJSFJPAについて書く予定です。

で、Doma 2について調査を開始しました。
エンティティが自動生成できたり、2Way-SQLだったり、Java SE 8で入ったOptionalやDate and Timeに対応してたり、いろいろと便利そうです。

まずはエンティティ自動生成から試そうと思って調べてみると、
Gen タスク — Doma-Gen 2.0 ドキュメント
おおっと、Gradleか。使ったことないなあ・・・(^^;
じゃあとりあえず、Doma 1みたいにAntタスクで実行してみっかということで、やってみました。

  • 必要なJARをそろえる

適当にMaven等からダウンロードしてください。
doma-2.0.1.jar
doma-gen-2.0.1.jar
freemarker-2.3.20.jar
postgresql-9.3-1102-jdbc41.jar(使用DBに合ったJDBCドライバを使ってください)

Ant使うので、普通のJavaプロジェクトで作成します。

  • ビルドファイルの作成・編集

NetBeansで[ファイル]タブを開きます。
作成したプロジェクト直下に「lib」フォルダを作成し、上記の全JARファイルを置きます。
次に、プロジェクト直下に「doma-gen-build.xml」を作成し、中身を下記のように編集します。
Doma 1のサイトからコピペして、必要事項を書き換えました。
Doma - Doma-Gen

<?xml version="1.0" encoding="UTF-8"?>
<project name="doma-gen-example" default="gen" basedir=".">

    <property name="javaDestDir" value="src"/>
    <property name="sqlDestDir" value="src"/>

    <!-- JDBCの設定 -->    
    <property name="dialectName" value="postgres"/>
    <property name="driverClassName" value="org.postgresql.Driver"/>
    <property name="url" value="jdbc:postgresql:postgres"/>
    <property name="user" value="postgres"/>
    <property name="password" value="P@ssw0rd"/>

    <!-- パッケージ名など -->
    <property name="entityPackageName" value="com.tada.doma2.entity"/>
    <property name="daoPackageName" value="com.tada.doma2.dao"/>
    <property name="configClassName" value="com.tada.doma2.AppConfig"/>
    <property name="sqlTestClassName" value="com.tada.doma2.SqlTest"/>

    <!-- 後はとりあえずサンプルのまま -->
    <property name="sqlFilePattern" value="META-INF/**/*.sql"/>
    
    <path id="classpath">
        <fileset dir="lib"/>
    </path>

    <taskdef name="gen" classname="org.seasar.doma.extension.gen.task.Gen" classpathref="classpath" loaderref="loader"/>
    <taskdef name="genTest" classname="org.seasar.doma.extension.gen.task.GenTest" loaderref="loader"/>
    <typedef name="entityConfig" classname="org.seasar.doma.extension.gen.task.EntityConfig" loaderref="loader"/>
    <typedef name="daoConfig" classname="org.seasar.doma.extension.gen.task.DaoConfig" loaderref="loader"/>
    <typedef name="sqlConfig" classname="org.seasar.doma.extension.gen.task.SqlConfig" loaderref="loader"/>
    <typedef name="sqlTestConfig" classname="org.seasar.doma.extension.gen.task.SqlTestCaseConfig" loaderref="loader"/>
    
    <target name="gen">
        <gen
            dialectName="${dialectName}"
            driverClassName="${driverClassName}"
            url="${url}"
            user="${user}"
            password="${password}">
            <entityConfig
                destdir="${javaDestDir}"
                packageName="${entityPackageName}"
            />
            <daoConfig
                destdir="${javaDestDir}"
                packageName="${daoPackageName}"
                configClassName="${configClassName}"
            />
            <sqlConfig
                destdir="${sqlDestDir}"
            />
        </gen>
    </target>

    <target name="genTest">
        <genTest
            dialectName="${dialectName}"
            driverClassName="${driverClassName}"
            url="${url}"
            user="${user}"
            password="${password}">
            <sqlTestConfig
                destdir="${javaDestDir}"
                testClassName="${sqlTestClassName}">
                <fileset dir="${sqlDestDir}">
                    <include name="${sqlFilePattern}"/>
                </fileset>
            </sqlTestConfig>
        </genTest>
    </target>

</project>

次に、元からあるbuild.xmlを、下記のように編集します。

<project name="Doma2" default="default" basedir=".">
    <description>Builds, tests, and runs the project Doma2.</description>
    <import file="nbproject/build-impl.xml"/>
    <!-- コレを追記! -->
    <import file="./doma-gen-build.xml"/>
    <!-- 後はそのまま -->
    ・・・
</project>

最終的にファイル構成はこんな感じになります。
f:id:MasatoshiTada:20141117160511p:plain

  • JARをクラスパスに追加

NetBeansで[プロジェクト]タブに戻ります。
プロジェクトの[ライブラリ]を右クリックして、[JAR/フォルダの追加]を選択します。
JARの選択画面になるので、DomaDoma-Gen、JDBCドライバの3つを選択します。
FreeMarkerは必要ありません)

  • いざ、実行!

NetBeansで[ファイル]タブに戻ります。
そして、build.xmlを右クリック→[ターゲット実行]→[その他のターゲット]→[gen]をクリック、で実行です。
f:id:MasatoshiTada:20141117162731p:plain

すると、何かエラーになりました。

C:\NetBeansProjects\Doma2\build.xml:13: The following error occurred while executing this line:
C:\NetBeansProjects\Doma2\doma-gen-build.xml:22: taskdef class org.seasar.doma.extension.gen.task.GenTest cannot be found


org.seasar.doma.extension.gen.task.GenTestというクラスが無い、と。
確かに、doma-gen-2.0.1.jarにはそんなクラスはありません。
たぶん、Doma 1にはあったけど、Doma 2では削除されたクラスなんでしょう。

では、doma-gen-build.xml内でこのクラスを指定している部分をコメントアウトするとどうだ!?

    <!-- コメントアウト
    <taskdef name="genTest" classname="org.seasar.doma.extension.gen.task.GenTest" loaderref="loader"/>
    -->

もう1回実行! すると・・・

ant -f C:\\NetBeansProjects\\Doma2 gen
gen:
[DOMAGEN0017] 方言にはクラス[org.seasar.doma.extension.gen.dialect.PostgresGenDialect]が使用されます。
[DOMAGEN0019] ファイルを作成しました。C:\NetBeansProjects\Doma2\src\com\tada\doma2\entity\Category.java
[DOMAGEN0019] ファイルを作成しました。C:\NetBeansProjects\Doma2\src\com\tada\doma2\entity\CategoryListener.java
[DOMAGEN0019] ファイルを作成しました。C:\NetBeansProjects\Doma2\src\com\tada\doma2\dao\CategoryDao.java
[DOMAGEN0019] ファイルを作成しました。C:\NetBeansProjects\Doma2\src\META-INF\com\tada\doma2\dao\CategoryDao\selectById.sql
[DOMAGEN0019] ファイルを作成しました。C:\NetBeansProjects\Doma2\src\com\tada\doma2\entity\Dept.java
[DOMAGEN0019] ファイルを作成しました。C:\NetBeansProjects\Doma2\src\com\tada\doma2\entity\DeptListener.java
[DOMAGEN0019] ファイルを作成しました。C:\NetBeansProjects\Doma2\src\com\tada\doma2\dao\DeptDao.java
[DOMAGEN0019] ファイルを作成しました。C:\NetBeansProjects\Doma2\src\META-INF\com\tada\doma2\dao\DeptDao\selectById.sql
・・・

お、成功っぽいぞ!
そして、また[プロジェクト]タブに戻って見てみると・・・
f:id:MasatoshiTada:20141117163745p:plain

おおお、エンティティ・SQLファイル・DAOが作成されていますね!


とりあえず、今日はここまで。
Advent CalendarではNetBeans+Gradleでやってみるかな~。