11

概括:

我遇到了一个有趣的问题,我不太确定如何调查它:

  • 我们的项目已经建设好几个月了
  • 我改变了maven-compiler-plugin使用eclipse编译器而不是javac
  • 现在当我跑步时mvn sitemaven-javadoc-plugin失败了
  • 根据堆栈跟踪,Javadoc 工具似乎在 Eclipse 编译器创建的类文件上崩溃

有没有什么办法解决这一问题?如果没有,至少有什么方法可以进一步调试它吗?

完整详情:

我正在使用 Java 1.6.0_27 和 Maven 3.0.2。

我一直在使用 javac 编译器来构建我们的代码库,但我有兴趣尝试 Eclipse 编译器,因为它会产生更好的警告(并且在其他方​​面更具可配置性)。

所以我将maven-compiler-pluginpom.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

我的问题:

好的,那改变了什么?当我使用 javac 时,所有 Javadoc 和 Maven 站点都构建得很好,但是当我切换到 Eclipse 编译器时,Javadoc 崩溃了。

更糟糕的是,它甚至没有告诉我是什么类导致它崩溃,所以我什至不知道从哪里开始调试它。

显然,目前这意味着我不会使用 Eclipse 编译器,而是会坚持使用 javac。但我很好奇为什么会发生这种情况,以及我可以做些什么来修复或解决它。

4

5 回答 5

3

我终于有时间再次研究这个问题。当进程失败时,maven-javadoc-plugin有用地留下一个javadoc.bat脚本,并且我能够通过修剪传递到的文件中的列表来找到有问题的包。target/site/apidocsjavadoc.exepackagesjavadoc.exe

有趣的是,有问题的代码原来是由Google Protocol Buffers编译器生成的 Java 源代码。这是幸运的,因为从 Javadoc 中完全排除 protobuf 生成的源代码是可以接受的。

<build>我在 POM 的 my和<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>
于 2012-02-14T20:43:22.113 回答
2

解决方法是为站点目标创建单独的配置文件。这样您就可以为不同的目标定义不同的编译器。

于 2011-11-19T00:29:54.663 回答
1

也许 javadoc.exe 没有使用 Eclipse 使用的相同 JRE。他们是否安装了其他任何 JRE?尝试手动运行 javadoc.exe 进程,看看它是否做同样的事情,你可能会得到问题的实际堆栈跟踪。

于 2012-01-12T23:33:45.847 回答
0

这可能不是一个答案,而只是提出一个想法。

在没有空间的文件夹中安装JDK怎么样(我看到它是C:\ Program Files(x86)......)。Java支持文件名中的空格,但javadoc工具可能不支持它的一些插件/工具/库。

于 2011-12-14T11:29:32.183 回答
0

我猜问题是 javac 和 eclipse 使用不同的 JDK 版本来编译你的代码

于 2012-01-14T18:22:47.883 回答