androidプロジェクトでjavadocを生成する

Eclipseを使えば簡単だと思っていたんだが、そうでも無かった。

ビルドツールもコマンドも使わず、EclipseのExportメニューでプロジェクトソースのjavadocを生成しようとすると、以下のエラーが出て途中で止まってしまう。

java.lang.ClassCastException: com.sun.tools.javadoc.ClassDocImpl cannot be cast to com.sun.javadoc.AnnotationTypeDoc
at com.sun.tools.javadoc.AnnotationDescImpl.annotationType(AnnotationDescImpl.java:46)
at com.sun.tools.doclets.internal.toolkit.util.ClassUseMapper.mapAnnotations(ClassUseMapper.java:439)
at com.sun.tools.doclets.internal.toolkit.util.ClassUseMapper.<init>(ClassUseMapper.java:183)
at com.sun.tools.doclets.formats.html.ClassUseWriter.generate(ClassUseWriter.java:109)
at com.sun.tools.doclets.formats.html.HtmlDoclet.generateOtherFiles(HtmlDoclet.java:92)
at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.startGeneration(AbstractDoclet.java:122)
at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.start(AbstractDoclet.java:64)
at com.sun.tools.doclets.formats.html.HtmlDoclet.start(HtmlDoclet.java:42)
at com.sun.tools.doclets.standard.Standard.start(Standard.java:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.tools.javadoc.DocletInvoker.invoke(DocletInvoker.java:269)
at com.sun.tools.javadoc.DocletInvoker.start(DocletInvoker.java:143)
at com.sun.tools.javadoc.Start.parseAndExecute(Start.java:340)
at com.sun.tools.javadoc.Start.begin(Start.java:128)
at com.sun.tools.javadoc.Main.execute(Main.java:41)
at com.sun.tools.javadoc.Main.main(Main.java:31)

一通りエラーをチェックして見ると、どうやら標準のjavadocコマンドでは認識できないアノテーションがあるのが原因のようだ。

    @SuppressLint("NewApi")
     ^
 シンボルを見つけられません。
    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
     ^
 シンボルを見つけられません。

最近は様々なライブラリでアノテーションを使用しているが、javadocのドックレットはアノーテションを処理していくことでHTMLを生成するので、これが認識できないと処理を中断してしまう。

エラーが発生しないようにするためには、標準以外のアノテーションが格納されているクラスのパスをjavadocのクラスパスに追加すれば良いのだが、例えば対象をAPI Level17のandroid.jarとした場合、javadocのオプションに

-classpath /Users/kazz/develop/android-sdk-macosx/platforms/android-17/android.jar

と追加しても、Eclipseでは"-classpathは二回指定できません"とエラーになってしまう。
正解は以下のように-bootclasspathオプションをセットすることだ。

-bootclasspath /Users/kazz/develop/android-sdk-macosx/platforms/android-17/android.jar

これなら"二回指定できません〜"のエラーは発生しない。