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
これなら"二回指定できません〜"のエラーは発生しない。