読者です 読者をやめる 読者になる 読者になる

/dev/null

(◞‸◟)

EclipseのAPT(annotation processing tool)で突然のエラーで死んだお話

一月くらい前に起きた現象ですが備忘録。

ギョームで使っているFramework、SAStrutsとO/R MapperのDoma。

どちらもannotation processing tool、いわゆるAPTをゴリゴリ利用しています。

アノテーションを付けるとコンパイル時に.apt_generatedあたりにファイルが吐かれてそれを元に色々便利というやつ。

で、プロジェクトが肥大すると.apt_genereatedに吐かれるファイルも相応にして増えていくわけなんですが、ある日突然プロジェクトに忌まわしき赤バツが。

しかもEclipseのデフォルトでは.apt_generatedは隠しフォルダ扱いになっているのでソースコードには問題がなく一体何が起きたのかわからない状態。

とてもつらい

で、ひたすらに調べるとどうやらEclipseのバグっぽい。

Bug 387956 – Cannot resolve import for generated class IF processing annotations with parameters referencing constants

パッチもあるっぽいけど、まぁわざわざあててビルドまでしたくない(実際したけど、ようわからんかった)。

で、NightlyBuildで治るのかなーと思ったけどなんか治らないしつらぽよ。

結局Antで

    <!-- Source Compile -->
    <target name="compile">
        <javac srcdir="${srcdir}" destdir="${classesdir}" includeAntRuntime="true" encoding="${src.encoding}" fork="yes" compiler="${javaconpiler.ver}" debug="on" debuglevel="source,lines">
            <classpath>
                <fileset dir="${webappdir}/WEB-INF/lib">
                    <include name="*.jar" />
                </fileset>
                <fileset dir="lib">
                    <include name="*.jar" />
                </fileset>
                <pathelement path="/usr/local/tomcat/lib/servlet-api.jar" />
            </classpath>
            <compilerarg line="-s .apt_generated" />
            <compilerarg line="-A${apt.dao.subpackage.key}=${apt.dao.subpackage.value} -A${apt.dao.suffix.key}=${apt.dao.suffix.value}" />
        </javac>
    </target>

こういう感じのタスク書いて、都度Eclipse上で実行させることに。

幸いにして毎回これをする必要なくて、プロジェクトのCleanとかする度にAntさせれば良さそうなのでそこまで負担じゃない。

こういう謎挙動にハマると一日潰れるのでとても辛いですね。