Domaを利用したアプリをMavenでビルドする方法
ここ数日のエントリで書いたように、Javacのバグが原因でMavenでのコンパイルが失敗します。Antでは成功するのですけどね。AntとMavenで挙動がちがうのは、AntはJavacのエラーコードで判定していて、MavenはJavacによって出力されるメッセージ内容で判別しているため。今回のJavacのバグというのが、本来はエラーでないのにエラーメッセージを出力してしまうという類のものなので、AntとMavenで挙動が変わってくるのです。
Mavenでもエラーコードで判定するようにできればいいのですが、奥のほうのコードなので修正しにくいです。というわけでコンパイルはAntでやればいいのかなと思っています。この方法は格好悪いかもしれませんが、とりあえず試した限りでは動きます。この方法には欠点があるよ、という場合は教えてください。
Mavenのためのpom.xml
... <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> ... <plugin> <artifactId>maven-antrun-plugin</artifactId> <executions> <execution> <id>ant-compile</id> <phase>compile</phase> <configuration> <tasks> <ant antfile="build-compile.xml" target="compile"> <property name="classpath" refid="maven.compile.classpath"/> </ant> </tasks> </configuration> <goals> <goal>run</goal> </goals> </execution> </executions> </plugin> ...
mvnではコンパイルしたくないのですが、skipの仕方がわからなかったのですべてをexcludeしています。
maven-antrun-pluginを使ってbuild-compile.xmlというビルドファイルを呼び出しています。
Antのためのbuild-compile.xml
<project name="doma-tutorial-compile" basedir="."> <property name="build" value="target/classes"/> <property name="apt_generated" value="target/apt_generated"/> <property name="src" value="src/main/java"/> <target name="compile"> <delete dir="${apt_generated}" failonerror="false"/> <mkdir dir="${apt_generated}"/> <javac fork="yes" compiler="javac1.6" debug="on" encoding="UTF-8" classpath="${classpath}" srcdir="${src}" destdir="${build}"> <compilerarg line="-s ${apt_generated}" /> </javac> </target> </project>
実際のコンパイルはantで行います。
http://d.hatena.ne.jp/taedium/20100201/p1#c の方法を使えばMavenだけで対応できますが、includeやexcludeで命名規約が必要になってしまいます。命名規約を使用することが受け入れられるならばこの方法でもぜんぜんいいと思います。
上に述べた方法はAntを使わなければいけませんが、命名規約を必要としません。さらに、Antではapt系のオプションがちゃんと指定できるというのもメリットです。Mavenでは1つしか指定できないという欠点があります。
pom.xmlの全体は次のディレクトリの下にあります。
https://www.seasar.org/svn/sandbox/doma/trunk/doma-tutorial