2008-09-04 17 views
53

Estoy usando una hormiga para generar javadocs, pero obtengo esta excepción una y otra vez: ¿por qué?¿Por qué estoy obteniendo una ClassCastException al generar javadocs?

Estoy usando la versión 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

¿Mezcla en qué versión de JDK se utiliza? –

Respuesta

54

Parece que este ha sido reportado como Java bug. Parece ser causada por el uso de anotaciones de una biblioteca de terceros (como JUnit) y sin incluir el jar con esa anotación en la invocación javadoc.

Si ese es el caso, solo use la opción -classpath en javadoc e incluya los archivos jar adicionales.

+2

Esto funcionó para mí. 'locate junit' apareció mucho, así que elegí uno al azar, lo puse en el classpath, y esa excepción en particular desapareció. Todavía creo que javadoc es ridículamente escaso, teniendo en cuenta lo ampliamente utilizado. –

+2

Para mí, tuve que agregar las bibliotecas de Jackson al classpath de javadoc. –

+0

Tuve que agregar anotaciones.jar a mi classpath, que está en el directorio android-sdk/tools/support – crobicha

1

Tengo alguna idea sobre este problema, pero esta no es la solución exacta para obtener.

Si le da una sola línea de comentario \\\\ antes de la anotación, intente ejecutar el javadoc una vez más. Este problema se resolverá

Ej: sample.java Archivo

@ChannelPipeline 

hace cambios en

\\\\@ChannelPipeline 

intenta ejecutar comandos javadoc una vez más. Ahora Class Cast Exception no ocurrirá

0

Tengo este problema también. Puedo compilar correctamente sin ningún error o advertencia. Pero cuando genero javadoc, obtuve el siguiente error.

[javadoc] java.lang.ClassCastException: com.sun.tools.javadoc.ClassDocImpl no se puede convertir a com.sun.javadoc.AnnotationTypeDoc

Aquí es mi ruta de clase de carga para mi tercero-libs ...

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

En mi objetivo java compilación ..

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

Y en mi objetivo 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> 

Por lo tanto, he añadido classpathref="build.classpath" opción de <javadoc etiqueta. Ahora está bien para mí.

0

Hay otra manera de conseguir un ClassCastException (1.8.0_101 está fallando actualmente):

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

Se va a pasar cuando javadoc encuentra una referencia a un método de anotación en el texto javadoc antes de procesar la misma anotación por primera vez utilizado en el código.Tome estas dos clases:

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


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

El error depende de la orden. Si javadoc procesa primero el TestClass1, se lanzará el ClassCastException. Si javadoc procesa primero TestClass2, se completará correctamente. El error se reporta como JDK-8170444.

Como solución alternativa, no haga un enlace a los métodos de anotación en el texto de la documentación.

Cuestiones relacionadas