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