【问题标题】:Why am I getting a ClassCastException when generating javadocs?为什么生成 javadocs 时会出现 ClassCastException?
【发布时间】:2010-09-07 20:59:18
【问题描述】:

我正在使用 ant 生成 javadocs,但一遍又一遍地得到这个异常 - 为什么?

我使用的是 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)

【问题讨论】:

  • 混用什么版本的JDK?

标签: java ant javadoc classcastexception


【解决方案1】:

还有另一种方法可以在 Java 5 到 8 版本中获得ClassCastException

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,并已解决为“不会修复”。 Java 9 中不再存在该错误。

作为一种解决方法,不要在文档文本中链接到注释方法。

【讨论】:

  • 我自己在一些需要针对 Java 8 编译的代码中遇到了这个问题。当使用 Java 8 运行 Javadoc 而不是使用 Java 9 时出现此错误。
【解决方案2】:

我对这个问题有一些想法,但这不是确切的解决方案。

如果您在注释前给出单个注释行// 并尝试再次运行 javadoc。这个问题会解决的

例如:sample.java 文件

@ChannelPipeline

修改

//@ChannelPipeline

再次尝试运行 javadoc 命令。现在ClassCastException 不会出现。

【讨论】:

    【解决方案3】:

    我也遇到了这个问题。我可以正确编译而不会出现任何错误或警告。但是当我生成 javadoc 时,出现以下错误。

    [javadoc] java.lang.ClassCastException:com.sun.tools.javadoc.ClassDocImpl 无法转换为 com.sun.javadoc.AnnotationTypeDoc

    这是我为第三方库加载的类路径...

    <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>
    

    所以,我在&lt;javadoc 标签中添加了classpathref="build.classpath" 选项。现在对我来说很好。

    【讨论】:

      【解决方案4】:

      这似乎已报告为Java bug。它似乎是由于使用来自 3rd 方库(如 JUnit)的注释而不包括 javadoc 调用中带有该注释的 jar 引起的。

      如果是这种情况,只需使用 javadoc 上的 -classpath 选项并包含额外的 jar 文件。

      【讨论】:

      • 这对我有用。 locate junit 出现了很多,所以我随机选择了一个,把它放在类路径上,那个特殊的异常就消失了。考虑到它的广泛使用,我仍然认为 javadoc 是荒谬的。
      • 对我来说,我必须将 Jackson 库添加到 javadoc 类路径中。
      • 我必须将 annotations.jar 添加到我的类路径中,该路径位于 android-sdk/tools/support 目录中
      猜你喜欢
      • 2014-12-06
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 1970-01-01
      相关资源
      最近更新 更多