APTで楽しく遊ぶ3つの方法

@t_yano が2011年のAdvent Calendarで書いていたAPT(Annotation Processing Tool)の話題に触発され、最近よくAPTで遊んでおります。

APTとは簡単に言うとアノテーション付きのコードを元に、自動的にコードを生成してくれる仕組みのことです。JPAのMetamodelやSeasarのDomaでDAOの生成に使われていたりします。

でもAPT使ったプロジェクトってデバッグがすげー面倒なんですよ。そのままだとEclipseはコード生成してくれないし、生成されたコードのテストもよくわからんし。

なので、今回はEclipseでAPTをラクラクに遊ぶ方法をご紹介します。

maven-processor-plugin

まずはMavenプラグインです。標準のmaven-compiler-pluginでもAPTを扱うことができるのですが、残念ながらEclipseプラグインのm2eは対応しておらず、Eclipse上で生成されたコードを参照することができません。maven-processor-pluginはコード生成のほか、後述するEclipseプラグインを使うことで、生成されるコードをリアルタイムに把握することができます。

pom.xmlには以下のようにプラグインの設定を記述してください。

<plugin>
	<groupId>org.bsc.maven</groupId>
	<artifactId>maven-processor-plugin</artifactId>
	<version>2.0.5</version>
	<executions>
		<execution>
			<id>process</id>
			<goals>
				<goal>process</goal>
			</goals>
			<phase>generate-sources</phase>
			<configuration>
				<compilerArguments>-encoding ${project.build.sourceEncoding}</compilerArguments>
				<processors>
					<processor>com.github.nagaseyasuhito.sandbox.SandboxAnnotationProcessor</processor>
				</processors>
			</configuration>
		</execution>
	</executions>
</plugin>

ちなみにgoalとphaseをそれぞれprocess-test、generate-test-sourcesにするとテストコードに対してコード生成されます。

m2e Connector for maven-processor-plugin

上記のプラグインのコード生成をEclipse上で行うEclipseプラグインです。アップデートサイトは以下のURLになります。EBussines  m2e Extensions -> m2e Connector for maven-processor-pluginをインストールしてください。

https://github.com/excilys/m2e-extras/raw/master/p2

インストールするとtarget/generated-sources/aptというディレクトリに自動的にコードが生成されるようになります。もちろんビルドパスも通っているので、コード補完の対象になります。便利!

Aptina Unit

Aptina UnitはAPTの単体テストを支援するJUnitの拡張です。テストコードの中で、APTによるコード生成や、生成されたコードのアサーションを行うことができます。

Seasarプロダクトなので以下のリポジトリを記述し、

<repository>
	<id>maven.seasar.org</id>
	<name>The Seasar Foundation Maven2 Repository</name>
	<url>http://maven.seasar.org/maven2</url>
</repository>

依存関係は以下のように記述してください。

<dependency>
	<groupId>org.seasar.aptina</groupId>
	<artifactId>aptina-unit</artifactId>
	<version>1.0.0</version>
	<scope>test</scope>
</dependency>

あとはテストケースで好きなように生成されたコードを検証してください。

public class SampleAnnotationProcessorTest extends AptinaTestCase {
	@Override
	protected void setUp() throws Exception {
		super.setUp();

		// 対象のクラスのソースパスを指定
		this.addSourcePath("src/test/java");

		// 文字コードの指定
		this.setCharset(Charset.forName("utf-8"));
	}

	public void annotationProcessorToolTest() throws IOException {
		// アノテーションプロセッサを追加
		this.addProcessor(new SampleAnnotationProcessor());

		// 対象のクラスを追加
		this.addCompilationUnit(Target.class);

		// コンパイル
		this.compile();
	}
}

APTの黒魔術

これまではコード生成といえばjavassistやcglibなどの動的なプロダクトを使う事が多かったかと思うのですが、APTを使えば簡単に安全なコード生成ができることがお分かりいただけたかと思います。完全なJavaコードが生成されるためIDEのコード補完ができるのも大きな魅力です。やろうと思えば、アノテーションに設計書のExcelシートを指定し、自動的にアプリケーションのひな形作成、なんてこともできると思います。

秀作としてJPAの@Entityがついたクラスから、俺々Criteriaを生成するアノテーションプロセッサを書きました。よかったら参考にしてみてください。

「APTで楽しく遊ぶ3つの方法」への1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>