使用Eclipse编译器而不是javac会导致javadoc崩溃
概要:
我遇到了一个有趣的问题,我不太确定如何侦察它:
- 我们的项目已经建好几个月了
- 我更改了
maven-compiler-plugin
以使用eclipse
编译器而不是javac
- 现在当我运行
mvn site
,maven-javadoc-plugin
失败了 - 根据堆栈跟踪,看起来Javadoc工具正在崩溃Eclipse编译器创建的类文件
有没有什么办法解决这一问题? 如果没有,是否至少有进一步调试的方法?
详细信息:
我正在使用Java 1.6.0_27和Maven 3.0.2。
我一直在使用javac编译器来构建我们的代码库,但我对尝试Eclipse编译器很感兴趣,因为它产生了更好的警告(并且在其他方面更易于配置)。
所以我将pom.xml中maven-compiler-plugin
的定义更改为:
maven-compiler-plugin 2.3.2 eclipse 1.6 1.6 -warn:+boxing,enumSwitch,javadoc,hashCode true true org.codehaus.plexus plexus-compiler-eclipse 1.8.2
在我的部分中,我有:
org.apache.maven.plugins maven-javadoc-plugin 2.8
到现在为止还挺好。 我做了一个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
我的问题:
好的,那改变了什么? 当我使用javac时,所有Javadoc和Maven站点都正常构建,但是当我切换到Eclipse编译器时,Javadoc崩溃了。
更糟糕的是,它甚至没有告诉我哪个类导致它崩溃,所以我甚至不知道从哪里开始调试它。
显然,暂时这意味着我不会使用Eclipse编译器,而是要坚持使用javac。 但我很好奇为什么会这样,以及我可以做些什么来修复或解决它。
我终于有时间再次研究这个问题。 当javadoc.exe
进程失败时, maven-javadoc-plugin
有助于在target/site/apidocs
下留下一个javadoc.bat
脚本,并且我能够通过修剪传递给javadoc.exe
的packages
文件中的列表来找到有问题的包。 javadoc.exe
。
有趣的是,有问题的代码被certificate是Google Protocol Buffers编译器生成的Java源代码。 这是幸运的,因为完全从Javadoc中简单地排除protobuf生成的源是可以接受的。
我在POM的
和
部分下添加了以下定义,这解决了我的问题:
org.apache.maven.plugins maven-javadoc-plugin 2.6.1 com.mycompany.myproject.proto
解决方法是为站点目标创建单独的配置文件。 这样您就可以为不同的目标定义不同的编译器。
也许javadoc.exe没有使用Eclipse使用的相同JRE。 他们是否安装了其他任何JRE? 尝试手动运行javadoc.exe进程,看看它是否做同样的事情,你可能会得到问题的实际堆栈跟踪。
这可能不是一个答案,而只是提出一个想法。
如何在没有空间的文件夹中安装JDK(我看到它是C:\ Program Files(x86)…)。 Java支持文件名中的空格,但是javadoc工具可能不支持它的一些插件/工具/库。
我猜测问题是javac和eclipse正在使用不同的JDK版本来编译代码