About

ドキュメント

Javadocs

プロジェクト文書

Built by Maven

概要

Domaを利用するアプリケーションを、AntもしくはMavenによってビルドする方法を示します。

2010年2月現在、javacにはaptに関するバグがあることが判明しています。 ここでは、このバグの回避を考慮に入れて解説します。

javacのバグについて

バグは、Bug DatabaseにBug ID 6403465として登録されています。 このバグの内容は、一言で言うと、本来はコンパイルエラーでないものがエラーとして報告されるというものです。

回避方法の1つは、誤って報告されるエラーメッセージを単に無視することです。

このバグの現象は、aptにより生成されるJavaコードに依存するコードをjavacの対象にすると起こります(aptにより生成されるJavaコードと依存するコードが異なるパッケージの場合にのみ起きます)。 たとえば、javacは、以下のコードに対し間違ったエラー報告をします(EmployeeDaoImplというクラスがaptにより生成されると前提します)。

package tutorial.service;

import tutorial.dao.EmployeeDao;
import tutorial.dao.EmployeeDaoImpl;
import tutorial.entity.Employee;

public class TutorialService {

    public Employee selectById(Integer id) {
        EmployeeDao dao = new EmployeeDaoImpl();
        return dao.selectById(id);
    }
}

javacから出力される間違ったエラー報告とは次のようなものです。

tutorial\service\TutorialService.java:19: シンボルを見つけられません。
シンボル: クラス EmployeeDaoImpl
場所    : tutorial.dao の パッケージ
import tutorial.dao.EmployeeDaoImpl;
                   ^

このメッセージが出力されても、実際にはコンパイルは成功しています。

Antによるビルド

Antでビルドを行うには、あらかじめAntをインストールしてください。 Ant 1.7で動作を確認しています。

Antでビルドを行う際のポイントを示します。

  • クラスパスには、doma-x.x.x.jarを指定する
  • コンパイル前にSQLファイルをクラスが出力されるディレクトリにコピーする
  • javacの-sオプションを使い、aptで生成されるコードの出力先ディレクトリを指定する

サンプルのビルドファイルを示します。このビルドファイルは、チュートリアルの配布ファイルに含まれるものです。 チュートリアルはダウンロードページからダウンロードできます。

<project name="doma-tutorial" default="jar" basedir=".">

    <property name="dest" value="target/build"/>
    <property name="apt_generated" value="target/apt_generated"/>
    <property name="src" value="src/main/java"/>
    <property name="resources" value="src/main/resources"/>

    <path id="classpath">
        <fileset dir="lib" includes="*.jar"/>
    </path>

    <target name="jar" depends="clean,copy,compile">
        <jar jarfile="target/doma-tutorial.jar" basedir="${dest}" />
    </target>

    <target name="clean">
        <delete dir="target" failonerror="false"/>
        <mkdir dir="target"/>
        <mkdir dir="${dest}"/>
        <mkdir dir="${apt_generated}"/>
    </target>

    <target name="compile">
        <javac fork="yes" compiler="javac1.6" debug="on" encoding="UTF-8"
            classpathref="classpath" srcdir="${src}" destdir="${dest}">
            <compilerarg line="-s ${apt_generated}" />
        </javac>
    </target>

    <target name="copy">
        <copy todir="${dest}" filtering="true">
            <fileset dir="${resources}">
                <include name="META-INF/**" />
            </fileset>
        </copy>
    </target>
</project>

javacタスク実行時にはjavacのバグによりエラーメッセージが誤って報告されますが、「BUILD SUCCESSFUL」というメッセージとともにAntの実行が終了すれば、ビルドは成功しています。

Antを使ったWebアプリケーションのビルドについては、Doma JPetStoreの配布ファイルに含まれるbuild.xmlを参考にしてください。 Doma JPetStoreはダウンロードページからダウンロードできます。

Mavenによるビルド

Mavenでビルドを行うには、あらかじめMavenをインストールしてください。 Maven 2.2.1で動作を確認しています。 ここでは、maven-antrun-pluginを使用しています。Antについてもあらかじめインストールしてください。

Mavenでビルドを行う際のポイントを示します。

  • Seasarのリポジトリを指定する
  • 依存関係の設定でdomaへの依存を指定する
  • maven-compiler-pluginでは、excludesタグを使って実質的にコンパイルを行わない
  • 実際のコンパイルはmaven-antrun-pluginの中でjavacタスクにより行う
  • javacタスクのclasspathref属性にはmaven.compile.classpathを指定する
  • javacの-sオプションを使い、aptで生成されるコードの出力先ディレクトリを指定する

コンパイルをAntで行う理由は、maven-compiler-pluginでは、javacのバグを回避できないためです。

サンプルのpom.xmlの抜粋を示します。pom.xmlは、チュートリアルに含まれるものです。 チュートリアルはダウンロードページからダウンロードできます。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    ...
    
    <repositories>
        <repository>
            <id>maven.seasar.org</id>
            <name>The Seasar Foundation Maven2 Repository</name>
            <url>http://maven.seasar.org/maven2</url>
        </repository>
        <repository>
            <id>maven.snapshot.seasar.org</id>
            <name>The Seasar Foundation Maven2 Repository(snapshot)</name>
            <url>http://maven.seasar.org/maven2-snapshot</url>
        </repository>
    </repositories>
    
    ...
    
    <!-- Build Settings -->
    <build>
        <defaultGoal>validate</defaultGoal>
        <pluginManagement>
            <plugins>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.6</source>
                        <target>1.6</target>
                        <encoding>UTF-8</encoding>
                        <excludes>
                            <exclude>**/*</exclude>
                        </excludes>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
        <plugins>
        
            ...
            
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <id>ant-compile</id>
                        <phase>compile</phase>
                        <configuration>
                            <tasks>
                                <property name="apt_generated" value="target/apt_generated"/>
                                <delete dir="${apt_generated}" failonerror="false"/>
                                <mkdir dir="${apt_generated}"/>
                                <javac fork="yes" compiler="javac1.6" debug="on" encoding="UTF-8"
                                    classpathref="maven.compile.classpath" srcdir="src/main/java" destdir="target/classes">
                                    <compilerarg line="-s ${apt_generated}" />
                                </javac>
                            </tasks>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            
            ...
            
        </plugins>
    </build>

    <!-- Dependency Settings -->
    <dependencies>
        <dependency>
            <groupId>org.seasar.doma</groupId>
            <artifactId>doma</artifactId>
            <version>1.0.0</version>
            <type>jar</type>
        </dependency>
        
        ...
        
    </dependencies>
</project>

javacタスク実行時にはjavacのバグによりエラーメッセージが誤って報告されますが、「BUILD SUCCESSFUL」というメッセージとともにMavenの実行が終了すれば、ビルドは成功しています。

Mavenを使ったWebアプリケーションのビルドについては、Doma JPetStoreの配布ファイルに含まれるpom.xmlを参考にしてください。 Doma JPetStoreはダウンロードページからダウンロードできます。