概要
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はダウンロードページからダウンロードできます。
