2008-09-04 5 views
53

私は、javadocsを生成するためにantを使用していますが、何度もこの例外が発生します - なぜですか?javadocを生成するときにClassCastExceptionが発生するのはなぜですか?

私はJDKバージョン1.6.0_06を使用しています。

[javadoc] java.lang.ClassCastException: com.sun.tools.javadoc.ClassDocImpl cannot be cast to com.sun.javadoc.AnnotationTypeDoc 
    [javadoc]  at com.sun.tools.javadoc.AnnotationDescImpl.annotationType(AnnotationDescImpl.java:46) 
    [javadoc]  at com.sun.tools.doclets.formats.html.HtmlDocletWriter.getAnnotations(HtmlDocletWriter.java:1739) 
    [javadoc]  at com.sun.tools.doclets.formats.html.HtmlDocletWriter.writeAnnotationInfo(HtmlDocletWriter.java:1713) 
    [javadoc]  at com.sun.tools.doclets.formats.html.HtmlDocletWriter.writeAnnotationInfo(HtmlDocletWriter.java:1702) 
    [javadoc]  at com.sun.tools.doclets.formats.html.HtmlDocletWriter.writeAnnotationInfo(HtmlDocletWriter.java:1681) 
    [javadoc]  at com.sun.tools.doclets.formats.html.FieldWriterImpl.writeSignature(FieldWriterImpl.java:130) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.FieldBuilder.buildSignature(FieldBuilder.java:184) 
    [javadoc]  at sun.reflect.GeneratedMethodAccessor8.invoke(Unknown Source) 
    [javadoc]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    [javadoc]  at java.lang.reflect.Method.invoke(Method.java:597) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.FieldBuilder.invokeMethod(FieldBuilder.java:114) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.AbstractBuilder.build(AbstractBuilder.java:90) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.AbstractMemberBuilder.build(AbstractMemberBuilder.java:56) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.FieldBuilder.buildFieldDoc(FieldBuilder.java:158) 
    [javadoc]  at sun.reflect.GeneratedMethodAccessor51.invoke(Unknown Source) 
    [javadoc]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    [javadoc]  at java.lang.reflect.Method.invoke(Method.java:597) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.FieldBuilder.invokeMethod(FieldBuilder.java:114) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.AbstractBuilder.build(AbstractBuilder.java:90) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.AbstractMemberBuilder.build(AbstractMemberBuilder.java:56) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.ClassBuilder.buildFieldDetails(ClassBuilder.java:301) 
    [javadoc]  at sun.reflect.GeneratedMethodAccessor43.invoke(Unknown Source) 
    [javadoc]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    [javadoc]  at java.lang.reflect.Method.invoke(Method.java:597) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.ClassBuilder.invokeMethod(ClassBuilder.java:101) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.AbstractBuilder.build(AbstractBuilder.java:90) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.ClassBuilder.buildClassDoc(ClassBuilder.java:124) 
    [javadoc]  at sun.reflect.GeneratedMethodAccessor19.invoke(Unknown Source) 
    [javadoc]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    [javadoc]  at java.lang.reflect.Method.invoke(Method.java:597) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.ClassBuilder.invokeMethod(ClassBuilder.java:101) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.AbstractBuilder.build(AbstractBuilder.java:90) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.ClassBuilder.build(ClassBuilder.java:108) 
    [javadoc]  at com.sun.tools.doclets.formats.html.HtmlDoclet.generateClassFiles(HtmlDoclet.java:155) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.generateClassFiles(AbstractDoclet.java:164) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.startGeneration(AbstractDoclet.java:106) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.start(AbstractDoclet.java:64) 
    [javadoc]  at com.sun.tools.doclets.formats.html.HtmlDoclet.start(HtmlDoclet.java:42) 
    [javadoc]  at com.sun.tools.doclets.standard.Standard.start(Standard.java:23) 
    [javadoc]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    [javadoc]  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    [javadoc]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    [javadoc]  at java.lang.reflect.Method.invoke(Method.java:597) 
    [javadoc]  at com.sun.tools.javadoc.DocletInvoker.invoke(DocletInvoker.java:215) 
    [javadoc]  at com.sun.tools.javadoc.DocletInvoker.start(DocletInvoker.java:91) 
    [javadoc]  at com.sun.tools.javadoc.Start.parseAndExecute(Start.java:340) 
    [javadoc]  at com.sun.tools.javadoc.Start.begin(Start.java:128) 
    [javadoc]  at com.sun.tools.javadoc.Main.execute(Main.java:41) 
    [javadoc]  at com.sun.tools.javadoc.Main.main(Main.java:31) 
+0

JDKのどのバージョンが混在して使用されていますか? –

答えて

54

これはJava bugと報告されているようです。サードパーティ製のライブラリ(JUnitなど)の注釈を使用し、javadoc呼び出しでその注釈付きのjarファイルを含まないことが原因です。

この場合、javadocで-classpathオプションを使用し、余分なjarファイルをインクルードします。

+2

これは私のために働いた。 'locate junit'がたくさん出てきたので、ランダムに選んでクラスパスに入れてください。その例外はなくなりました。 私はまだjavadocがどれほど広く使われているかを考えれば、ばかげたフレークだと思います。 –

+2

私にとっては、javadocクラスパスにJacksonライブラリを追加する必要がありました。 –

+0

annotations.jarをクラスパスに追加する必要がありました。これはandroid-sdk/tools/supportディレクトリにあります – crobicha

1

私はこの問題に関するいくつかのアイデアを持っていますが、これは正確な解決策ではありません。

アノテーションの前に1つのコメント行\\\\を付けて、もう一度javadocを実行しようとすると、この問題は

例えば解決します:sample.javaファイル

@ChannelPipeline 

が再びjavadocコマンドを実行するために

\\\\@ChannelPipeline 

てみてくださいに変更を行います。クラスキャスト例外が発生しません

0

この問題もあります。エラーや警告なしで正しくコンパイルできます。しかし、私はjavadocを生成するとき、私は以下のエラーを受けました。

[javadocの]とjava.lang.ClassCastException:com.sun.tools.javadoc.ClassDocImplはcom.sun.javadoc.AnnotationTypeDocにキャストすることはできません

ここでは私のクラスパス・ロードであります私のサードパーティ-libsのための...

<path id="build.classpath"> 
<fileset dir="."> 
    <include name="libs/*.jar" /> 
</fileset> 

私のJavaのコンパイル対象では...

<target name="compile" depends="clean, makedir"> 
<javac includeantruntime="false" srcdir="${src.dir}" destdir="${build.dir}" classpathref="build.classpath"> 
    <compilerarg value="-Xlint:unchecked"/> 
</javac> 

そして、私のjavadocターゲットで...だから

<target name="docs" depends="compile"> 
<javadoc packagenames="src" sourcepath="${src.dir}" destdir="${docs.dir}" 
    failonerror="no" 
    author="true" 
    version="true" 
    windowtitle="${Name} API" 
    doctitle="${Name}" 
    bottom="Copyright © 2014 ColayHIlls.com . All Rights Reserved."> 
    <fileset dir="${src.dir}"> 
      <include name="main/java/com/colayhills/jpcenter/business/service/**" /> 
    </fileset> 
</javadoc> 
<echo message="java docs has been generated!"/> 
</target> 

、私は<javadocタグにclasspathref="build.classpath"オプションを追加しました。今は私にとっては大丈夫です。

0

ClassCastException(1.8.0_101が現在失敗している)を取得する別の方法があります:

java.lang.ClassCastException: com.sun.tools.javadoc.MethodDocImpl cannot be cast to com.sun.tools.javadoc.AnnotationTypeElementDocImpl

javadocは同じ注釈を処理する前に、javadocのテキストでの注釈メソッドへの参照に遭遇したとき、それが起こる

コードで初めて使用されます。

/** 
** {@link javax.annotation.Generated#value()} 
*/ 
public class TestClass1 {} 


@Generated("sometext") 
public class TestClass2 {} 

バグの順序は依存しています。 javadocがTestClass1を最初に処理する場合、ClassCastExceptionがスローされます。 javadocがTestClass2を最初に処理すると、正常終了します。このバグはJDK-8170444と報告されています。

回避策として、ドキュメントテキストの注釈メソッドにリンクしないでください。

関連する問題