لماذا أحصل على ClassCastException عند إنشاء javadocs؟
-
09-06-2019 - |
سؤال
أنا أستخدم النملة لإنشاء 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)
المحلول
يبدو أن هذا قد تم الإبلاغ عنه باعتباره خطأ جافا.يبدو أن السبب في ذلك هو استخدام التعليقات التوضيحية من مكتبة تابعة لجهة خارجية (مثل JUnit) وعدم تضمين الجرة مع هذا التعليق التوضيحي في استدعاء javadoc.
إذا كان الأمر كذلك، فما عليك سوى استخدام خيار -classpath في javadoc وتضمين ملفات jar الإضافية.
نصائح أخرى
لدي بعض الأفكار بخصوص هذه المشكلة ولكن هذا ليس الحل الدقيق الذي يمكنني الحصول عليه.
إذا أعطيت سطر تعليق واحد \\\\
قبل التعليق التوضيحي وحاول تشغيل javadoc مرة أخرى.سوف تحل هذه المشكلة
على سبيل المثال:ملف Sample.java
@ChannelPipeline
يقوم بإجراء تغييرات في
\\\\@ChannelPipeline
حاول تشغيل أمر javadoc مرة أخرى.الآن لن يحدث استثناء Class Cast
حصلت على هذه المشكلة أيضا.يمكنني التجميع بشكل صحيح دون أي أخطاء أو تحذيرات.ولكن عندما أقوم بإنشاء 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>
في هدف تجميع جافا الخاص بي ..
<target name="compile" depends="clean, makedir">
<javac includeantruntime="false" srcdir="${src.dir}" destdir="${build.dir}" classpathref="build.classpath">
<compilerarg value="-Xlint:unchecked"/>
</javac>
وعلى هدف جافادوك الخاص بي ...
<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>
لذلك أضفت classpathref="build.classpath"
خيار ل <javadoc
بطاقة شعار.الآن كل شيء على ما يرام بالنسبة لي.
هناك طريقة أخرى للحصول على 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
أولا، سوف يكتمل بشكل جيد.تم الإبلاغ عن الخطأ كـ جدك-8170444.
كحل بديل، لا تقم بالربط بطرق التعليقات التوضيحية في نص الوثائق الخاص بك.