Почему я получаю ClassCastException при создании документации javadocs?

Я использую ant для создания документации javadoc, но получаю это исключение снова и снова - почему?

Я использую версию 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 используется?

Johan Lübcke 05.09.2008 01:48
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
54
1
22 136
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Похоже, это было зарегистрировано как Ошибка Java. Похоже, это вызвано использованием аннотаций из сторонней библиотеки (например, JUnit) и не включением jar-файла с этой аннотацией в вызов javadoc.

В этом случае просто используйте параметр -classpath в javadoc и включите дополнительные файлы jar.

Это сработало для меня. locate junit нашел много, поэтому я выбрал один случайным образом, поместил его в путь к классам, и это конкретное исключение исчезло. Я все еще считаю javadoc до смешного беспорядочным, учитывая, насколько широко он используется.

Steve Bennett 04.02.2011 08:30

Мне пришлось добавить библиотеки Джексона в путь к классам javadoc.

Ethan Mick 25.01.2013 22:37

Мне пришлось добавить annotations.jar в мой путь к классам, который находится в каталоге android-sdk / tools / support

crobicha 16.07.2014 21:52

У меня есть некоторое представление об этой проблеме, но это не точное решение.

Если вы дадите одну строку комментария // перед аннотацией и попытаетесь запустить javadoc еще раз. Эта проблема решит

Например: файл sample.java

@ChannelPipeline

Вносит изменения в

//@ChannelPipeline

Попробуйте еще раз запустить команду javadoc. Теперь ClassCastException не появится.

У меня тоже эта проблема. Я могу правильно скомпилировать без ошибок и предупреждений. Но когда я создал javadoc, я получил ошибку ниже.

[javadoc] java.lang.ClassCastException: com.sun.tools.javadoc.ClassDocImpl cannot be cast to 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>

Итак, я добавил опцию classpathref = "build.classpath" в тег <javadoc. Теперь это нормально для меня.

Есть еще один способ получить ClassCastException в версиях Java с 5 по 8:

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. Я получаю эту ошибку при запуске Javadoc с Java 8, но не с Java 9.

M. Justin 27.10.2020 23:24

Другие вопросы по теме