为什么在生成 javadoc 时会收到 ClassCastException?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/44853/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Why am I getting a ClassCastException when generating javadocs?
提问by ScArcher2
I'm using ant to generate javadocs, but get this exception over and over - why?
我正在使用 ant 生成 javadoc,但是一遍又一遍地得到这个异常 - 为什么?
I'm using JDK version 1.6.0_06.
我正在使用 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)
采纳答案by John Meagher
It looks like this has been reported as a Java bug. It appears to be caused by using annotations from a 3rd party library (like JUnit) and not including the jar with that annotation in the javadoc invocation.
看起来这已被报告为Java 错误。它似乎是由于使用来自 3rd 方库(如 JUnit)的注释并且在 javadoc 调用中不包含带有该注释的 jar 引起的。
If that is the case, just use the -classpath option on javadoc and include the extra jar files.
如果是这种情况,只需在 javadoc 上使用 -classpath 选项并包含额外的 jar 文件。
回答by KasthuriRengan
I have some idea regarding this problem but this not exact solution to get.
我对这个问题有一些想法,但这不是确切的解决方案。
If you give single comment line \\\\
before annotation and try to run the javadoc once again. This problem will solve
如果您\\\\
在注释前给出单个注释行并尝试再次运行 javadoc。这个问题会解决
Eg: sample.java File
例如:sample.java 文件
@ChannelPipeline
Makes changes in
进行更改
\\@ChannelPipeline
Try to run javadoc command once again. Now Class Cast Exception won't occur
再次尝试运行 javadoc 命令。现在不会发生 Class Cast Exception
回答by Cataclysm
I got this problem too. I can compile properly without any errors or warnings. But when I generating javadoc , I got below error.
我也遇到了这个问题。我可以正确编译而没有任何错误或警告。但是当我生成 javadoc 时,出现以下错误。
[javadoc] java.lang.ClassCastException: com.sun.tools.javadoc.ClassDocImpl cannot be cast to com.sun.javadoc.AnnotationTypeDoc
[javadoc] java.lang.ClassCastException: com.sun.tools.javadoc.ClassDocImpl 不能转换为 com.sun.javadoc.AnnotationTypeDoc
Here is my classpath loading for my third-party-libs ...
这是我的第三方库的类路径加载...
<path id="build.classpath">
<fileset dir=".">
<include name="libs/*.jar" />
</fileset>
At my java compile target ..
在我的java编译目标..
<target name="compile" depends="clean, makedir">
<javac includeantruntime="false" srcdir="${src.dir}" destdir="${build.dir}" classpathref="build.classpath">
<compilerarg value="-Xlint:unchecked"/>
</javac>
And at my javadoc target...
在我的 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>
So , I added classpathref="build.classpath"
option to <javadoc
tag. Now It is fine for me.
所以,我添加classpathref="build.classpath"
了<javadoc
标签选项。现在对我来说很好。
回答by Eduard Wirch
There is another way to get a ClassCastException
(1.8.0_101 is failing currently):
还有另一种方法可以获得ClassCastException
(1.8.0_101 当前失败):
java.lang.ClassCastException: com.sun.tools.javadoc.MethodDocImpl cannot be cast to com.sun.tools.javadoc.AnnotationTypeElementDocImpl
java.lang.ClassCastException: com.sun.tools.javadoc.MethodDocImpl cannot be cast to com.sun.tools.javadoc.AnnotationTypeElementDocImpl
It will happen when javadoc encounters a reference to a annotation method in javadoc text before processing the same annotation for the first time used in code. Take these two classes:
当 javadoc 在处理第一次在代码中使用的相同注释之前,在 javadoc 文本中遇到对注释方法的引用时,就会发生这种情况。上这两门课:
/**
** {@link javax.annotation.Generated#value()}
*/
public class TestClass1 {}
@Generated("sometext")
public class TestClass2 {}
The bug is order dependent. If javadoc processes TestClass1
first, the ClassCastException
will be thrown. If javadoc processes TestClass2
first, it will complete fine. The bug is reported as JDK-8170444.
该错误是顺序相关的。如果 javadocTestClass1
首先处理,ClassCastException
将抛出 。如果 javadocTestClass2
首先处理,它将很好地完成。该错误报告为JDK-8170444。
As a workaround, don't link to annotation methods in your documentation text.
作为一种解决方法,不要链接到文档文本中的注释方法。