かとじゅんの技術日誌

技術の話をするところ

maven-antrun-pluginでs2jdbc-genのタスクを実行させる件

s2jdbc-genはantのタスクが用意されていて,DoltengSAStruts/S2JDBCのプロジェクトを作成するとs2jdbc-gen-build.xmlが作成されます.しかし,pom.xmlmaven-eclipse-plugin形式のプロジェクトに変更してしまうと,クラスパスの問題でそのままではs2jdbc-gen-build.xmlが実行できなくなります.
まぁ,ちまちまM2_REPOのクラスパスをs2jdbc-gen-build.xmlに1個1個定義してあげればなんとかなりますが,pom.xmlのdependencyのversionなどが変更になった場合都度修正するのが面倒なんで,maven-antrun-pluginを使いますです.以下のようなplugin設定を施せばスキーマからエンティティやサービスクラスを生成することができます.antにmaven.runtime.classpathを渡してあげるのがみそですね.ただ,compileフェーズで毎回実行されてしまうので,独自のフェーズを定義してあげたほうがよいかもしれません.そのあたり私もMaven2を理解しきっていないので何かよい方法があれば教えてくださいw
そもそもMaven2のプラグインとして実装したほうがよいかもしれませんが,とりあえずお手軽に実行できる手段として作ってみました.

	<build>
	...
		<plugins>
		...
			<plugin>
				<artifactId>maven-antrun-plugin</artifactId>
				<dependencies>
					<dependency>
						<groupId>org.apache.ant</groupId>
						<artifactId>ant</artifactId>
						<version>1.7.0</version>
					</dependency>
				</dependencies>
				<executions>
					<execution>
						<id>gen-entity</id>
						<phase>compile</phase>
						<configuration>
							<tasks>
								<property name="classpathdir"
									value="target/classes" />
								<property name="rootpackagename"
									value="hogehoge" />
								<property name="entitypackagename"
									value="entity" />
								<property name="javafiledestdir"
									value="src/main/java" />
								<property name="testjavafiledestdir"
									value="src/test/java" />
								<property name="javafileencoding"
									value="UTF-8" />
								<property name="env" value="ut" />
								<property name="jdbcmanagername"
									value="jdbcManager" />

								<taskdef
									resource="s2jdbc-gen-task.properties" classpathref="maven.runtime.classpath">
								</taskdef>
								<gen-entity
									rootpackagename="${rootpackagename}"
									entitypackagename="${entitypackagename}"
									javafiledestdir="${javafiledestdir}"
									javafileencoding="${javafileencoding}" env="${env}"
									jdbcmanagername="${jdbcmanagername}" classpathref="maven.runtime.classpath">
								</gen-entity>
								<javac srcdir="${javafiledestdir}"
									destdir="${classpathdir}" encoding="${javafileencoding}"
									fork="true" debug="on" classpathref="maven.runtime.classpath">
									<include
										name="${rootpackagename}/${entitypackagename}/**" />
								</javac>
								<gen-test classpathdir="${classpathdir}"
									rootpackagename="${rootpackagename}"
									entitypackagename="${entitypackagename}"
									javafiledestdir="${testjavafiledestdir}"
									javafileencoding="${javafileencoding}" env="${env}"
									jdbcmanagername="${jdbcmanagername}" classpathref="maven.runtime.classpath" />
								 <gen-condition
									classpathdir="${classpathdir}"
									rootpackagename="${rootpackagename}"
									entitypackagename="${entitypackagename}"
									javafiledestdir="${javafiledestdir}"
									javafileencoding="${javafileencoding}" env="${env}"
									jdbcmanagername="${jdbcmanagername}" classpathref="classpath" />
								<gen-names
									classpathdir="${classpathdir}"
									rootpackagename="${rootpackagename}"
									entitypackagename="${entitypackagename}"
									javafiledestdir="${javafiledestdir}"
									javafileencoding="${javafileencoding}" env="${env}"
									jdbcmanagername="${jdbcmanagername}" classpathref="maven.runtime.classpath" />
								<gen-service
									classpathdir="${classpathdir}"
									rootpackagename="${rootpackagename}"
									entitypackagename="${entitypackagename}"
									javafiledestdir="${javafiledestdir}"
									javafileencoding="${javafileencoding}" env="${env}"
									jdbcmanagername="${jdbcmanagername}" classpathref="maven.runtime.classpath" />
							</tasks>
						</configuration>
						<goals>
							<goal>run</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		...
		</plugins>
	...
	</build>
	<dependencies>
	...
		<dependency>
			<groupId>org.seasar.container</groupId>
			<artifactId>s2jdbc-gen</artifactId>
			<version>0.9.1</version>
		</dependency>
	...
	<dependencies>

※ウェブアプリプロジェクトの場合はclasspathdirをsrc/main/webapp/WEB-INF/classesなど適切な場所にしてください.