Использование компилятора Eclipse вместо javac приводит к сбою javadoc - PullRequest
11 голосов
/ 19 ноября 2011

Резюме:

У меня возникла интересная проблема, и я не совсем уверен, как ее решить:

  • Наш проект строился нормально месяцами
  • Я изменил maven-compiler-plugin, чтобы использовать eclipse компилятор вместо javac
  • Теперь, когда я запускаю mvn site, maven-javadoc-plugin терпит неудачу
  • В соответствии страссировка стека, похоже, что инструмент Javadoc дает сбой в файле класса, созданном компилятором Eclipse

Есть ли способ исправить это?Если нет, есть ли хоть какой-нибудь способ отладки?

Полная информация:

Я использую Java 1.6.0_27 и Maven 3.0.2.

IЯ использовал компилятор javac для создания нашей кодовой базы, но мне интересно попробовать компилятор Eclipse, так как он выдает гораздо лучшие предупреждения (и более настраиваемый другими способами).

Поэтому я изменил определениеиз maven-compiler-plugin в pom.xml:

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.3.2</version>
    <configuration>
        <compilerId>eclipse</compilerId>
        <source>1.6</source>
        <target>1.6</target>
        <compilerArgument>-warn:+boxing,enumSwitch,javadoc,hashCode</compilerArgument>
        <showWarnings>true</showWarnings>
        <showDeprecation>true</showDeprecation>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>org.codehaus.plexus</groupId>
            <artifactId>plexus-compiler-eclipse</artifactId>
            <version>1.8.2</version>
        </dependency>
    </dependencies>
</plugin>

В моем разделе <reporting> у меня есть:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>2.8</version>
</plugin>

Пока все хорошо.Я сделал mvn clean install, и все прекрасно работает, все тесты проходят, и все выглядит отлично.

Но когда я пытаюсь запустить mvn site, когда он попадает в отчет Javadoc, он не с тем, что появляетсябыть аварийным завершением Javadoc:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-site-plugin:3.0:site (default-site) on project framework: Error during page generation: Error rendering Maven report:
[ERROR] Exit code: 1 - java.lang.StringIndexOutOfBoundsException: String index out of range: -15
[ERROR] at java.lang.String.substring(String.java:1937)
[ERROR] at java.lang.String.substring(String.java:1904)
[ERROR] at com.sun.tools.javac.jvm.ClassReader.simpleBinaryName(ClassReader.java:958)
[ERROR] at com.sun.tools.javac.jvm.ClassReader.readEnclosingMethodAttr(ClassReader.java:930)
[ERROR] at com.sun.tools.javac.jvm.ClassReader.readMemberAttr(ClassReader.java:909)
[ERROR] at com.sun.tools.javac.jvm.ClassReader.readClassAttr(ClassReader.java:1053)
[ERROR] at com.sun.tools.javac.jvm.ClassReader.readClassAttrs(ClassReader.java:1067)
[ERROR] at com.sun.tools.javac.jvm.ClassReader.readClass(ClassReader.java:1560)
[ERROR] at com.sun.tools.javac.jvm.ClassReader.readClassFile(ClassReader.java:1658)
[ERROR] at com.sun.tools.javac.jvm.ClassReader.fillIn(ClassReader.java:1845)
[ERROR] at com.sun.tools.javac.jvm.ClassReader.complete(ClassReader.java:1777)
[ERROR] at com.sun.tools.javac.code.Symbol.complete(Symbol.java:386)
[ERROR] at com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:763)
[ERROR] at com.sun.tools.javac.code.Symbol$ClassSymbol.flags(Symbol.java:695)
[ERROR] at com.sun.tools.javadoc.ClassDocImpl.getFlags(ClassDocImpl.java:105)
[ERROR] at com.sun.tools.javadoc.ClassDocImpl.isAnnotationType(ClassDocImpl.java:116)
[ERROR] at com.sun.tools.javadoc.DocEnv.isAnnotationType(DocEnv.java:574)
[ERROR] at com.sun.tools.javadoc.DocEnv.getClassDoc(DocEnv.java:546)
[ERROR] at com.sun.tools.javadoc.PackageDocImpl.getClasses(PackageDocImpl.java:154)
[ERROR] at com.sun.tools.javadoc.PackageDocImpl.addAllClassesTo(PackageDocImpl.java:170)
[ERROR] at com.sun.tools.javadoc.RootDocImpl.classes(RootDocImpl.java:178)
[ERROR] at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.startGeneration(AbstractDoclet.java:96)
[ERROR] at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.start(AbstractDoclet.java:64)
[ERROR] at com.sun.tools.doclets.formats.html.HtmlDoclet.start(HtmlDoclet.java:42)
[ERROR] at com.sun.tools.doclets.standard.Standard.start(Standard.java:23)
[ERROR] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[ERROR] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[ERROR] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[ERROR] at java.lang.reflect.Method.invoke(Method.java:597)
[ERROR] at com.sun.tools.javadoc.DocletInvoker.invoke(DocletInvoker.java:269)
[ERROR] at com.sun.tools.javadoc.DocletInvoker.start(DocletInvoker.java:143)
[ERROR] at com.sun.tools.javadoc.Start.parseAndExecute(Start.java:340)
[ERROR] at com.sun.tools.javadoc.Start.begin(Start.java:128)
[ERROR] at com.sun.tools.javadoc.Main.execute(Main.java:41)
[ERROR] at com.sun.tools.javadoc.Main.main(Main.java:31)
[ERROR] 
[ERROR] Command line was: "C:\Program Files (x86)\Java\jdk1.6.0_27\jre\..\bin\javadoc.exe" @options @packages
[ERROR] 
[ERROR] Refer to the generated Javadoc files in 'C:\Projects\SMF\framework\target\site\apidocs' dir.
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

Мой вопрос:

ОК, так что изменилось?Все Javadoc и сайт Maven работали очень хорошо, когда я использовал javac, но как только я переключился на компилятор Eclipse, Javadoc вылетает.

Хуже того, он даже не говорит мне, какой класс вызвал егосбой, так что я даже не знаю, с чего начать отладку.

Очевидно, на данный момент это означает, что я не собираюсь использовать компилятор Eclipse, и я буду придерживатьсяJavac вместо.Но мне любопытно , почему это происходит, и что я мог бы сделать, чтобы исправить или обойти это.

Ответы [ 5 ]

3 голосов
/ 15 февраля 2012

Наконец-то у меня появилось время снова заняться этим. maven-javadoc-plugin очень быстро оставляет скрипт javadoc.bat в target/site/apidocs, когда происходит сбой процесса javadoc.exe, и я смог найти нарушающий пакет, удалив список в файле packages, который передается в javadoc.exe .

Интересно, что проблемный код оказался источником Java, сгенерированным компилятором Google Protocol Buffers . Это повезло, так как допустимо просто исключить сгенерированный протобуф источник из Javadoc полностью.

Я добавил следующее определение в оба раздела POM <build> и <reporting>, и это решило мою проблему:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>2.6.1</version>
    <configuration>
        <excludePackageNames>com.mycompany.myproject.proto</excludePackageNames>
    </configuration>
</plugin>
2 голосов
/ 19 ноября 2011

Обходным путем для этого может быть создание отдельного профиля для цели сайта.Чтобы вы могли определить разные компиляторы для разных целей.

1 голос
/ 13 января 2012

Возможно, javadoc.exe не использует ту же JRE, что и Eclipse. У них установлены другие JRE? Попробуйте запустить процесс javadoc.exe вручную и посмотрите, выполняет ли он то же самое, вы можете получить фактическую трассировку стека проблемы.

0 голосов
/ 14 января 2012

Я предполагаю, что проблема в том, что javac и eclipse используют разные версии JDK для компиляции вашего кода

0 голосов
/ 14 декабря 2011

Это может быть не ответ, а просто предложить идею.

Как насчет установки JDK в папку без пробелов (я видел, что это C: \ Program Files (x86) ...).Java поддерживает пробелы в именах файлов, но, возможно, некоторые из плагинов / инструментов / библиотек, которые инструменты javadoc просто не поддерживают.

...