概要
Domaを利用するアプリケーションを、AntもしくはMavenによってビルドする方法を示します。
2011年8月現在、JDK6のjavacにはaptに関するバグがあることが判明しています。 ここでは、このバグの回避を考慮に入れて解説します。
なお、このバグはJDK7のjavacでは解決されています。
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; ^
このメッセージが出力されても、実際にはコンパイルは成功しています。
もう1つの回避方法は、aptにより生成されるJavaコードに直接依存するコードを書かないことです。 この方法を利用する場合、aptにより生成されるJavaコードのクラスには実行時にリフレクションを使ってアクセスする必要があります。 この場合、自前でファクトリクラスを作成するか、Seasar2やSpring Frameworkといった汎用的なDIコンテナを活用することを推奨します。
javacの警告について
JDK7のjavacを使ってDomaを利用するプログラムをコンパイルすると、次のような警告メッセージが出力されます。
[javac] 警告:注釈プロセッサ'org.seasar.doma.internal.apt.DomainProcessor'から-source '1.7'より小さいソース・バージョン'RELEASE_6'がサポートされています [javac] 警告:注釈プロセッサ'org.seasar.doma.internal.apt.EnumDomainProcessor'から-source '1.7'より小さいソース・バージョン'RELEASE_6'がサポートされています [javac] 警告:注釈プロセッサ'org.seasar.doma.internal.apt.EntityProcessor'から-source '1.7'より小さいソース・バージョン'RELEASE_6'がサポートされています [javac] 警告:注釈プロセッサ'org.seasar.doma.internal.apt.DaoProcessor'から-source '1.7'より小さいソース・バージョン'RELEASE_6'がサポートされています [javac] 警告4個
これは、DomaがJava6で作成されているためです。 この警告が出てもDomaの動作には問題はありません。
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のプラグインであるmaven-compiler-pluginを使うとコンパイルとaptの処理を実行できますが、maven-compiler-pluginはaptに複数のパラメータを渡せないというバグがあります。 このバグは、MCOMPILER-135としてJIRAに登録されています。 そこで、maven-compiler-pluginではコンパイルのみを行い、aptの処理にはmaven-processor-pluginを利用します。
Mavenでビルドを行う際のポイントを示します。
- 依存関係の設定でdomaへの依存を指定する
- maven-resources-pluginを使いSQLファイルのコピーを行う
- 上記処理後、maven-processor-pluginでapt処理を行う
- 上記処理後、maven-compiler-pluginを使いコンパイルを行う(ただし、aptの処理は行わない。つまり、compilerArgumentで-proc:noneを指定する)
サンプルの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> <!-- Build Settings --> <build> <defaultGoal>validate</defaultGoal> <pluginManagement> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.6</source> <target>1.6</target> <encoding>UTF-8</encoding> <compilerArgument>-proc:none</compilerArgument> </configuration> </plugin> </plugins> </pluginManagement> <plugins> ... <plugin> <artifactId>maven-resources-plugin</artifactId> <version>2.5</version> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.bsc.maven</groupId> <artifactId>maven-processor-plugin</artifactId> <executions> <execution> <id>process</id> <goals> <goal>process</goal> </goals> <phase>process-resources</phase> <configuration> <outputDirectory>${project.build.directory}/apt_generated</outputDirectory> </configuration> </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>
この例では使用していませんが、aptにパラメータを渡す場合にはmaven-processor-pluginのcompilerArguments要素を使ってください。
maven-compiler-plugin実行時にはjavacのバグによりエラーメッセージが誤って報告されますが、「BUILD SUCCESSFUL」というメッセージとともにMavenの実行が終了すれば、ビルドは成功しています。
Mavenを使ったWebアプリケーションのビルドについては、Doma JPetStoreの配布ファイルに含まれるpom.xmlを参考にしてください。 Doma JPetStoreはダウンロードページからダウンロードできます。