2011-11-18 27 views
11

摘要:

我碰到一個有趣的問題,我不太清楚如何以偵探它:使用Eclipse編譯器,而不是在Javadoc崩潰javac的結果

  • 我們的項目已經建築罰款個月
  • 我改變了maven-compiler-plugin當我運行mvn site使用eclipse編譯器,而不是javac
  • 現在,maven-javadoc-plugin失敗
  • 根據堆棧跟蹤,它出現在Javadoc工具崩潰對Eclipse編譯器

創建一個類文件有沒有什麼辦法解決這一問題?如果沒有,至少有什麼方法可以進一步調試它?

全部細節:

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

我一直在使用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 

我的問題:

好了,有什麼改變?當我使用javac時,所有的Javadoc和Maven站點都很好,但是當我切換到Eclipse編譯器時,Javadoc崩潰了。更糟的是,它甚至不告訴我什麼類導致它崩潰,所以我甚至不知道從哪裏開始調試。

顯然,暫時這意味着我不打算使用Eclipse編譯器,而是要使用javac來代替。但我很好奇爲什麼這種情況正在發生,以及我可能做些什麼來解決或解決它。

+0

這很奇怪。也許它是一個「默認」問題---你能用顯式參數運行javac嗎? – jayunit100

+0

@ jayunit100:我實際上並沒有調用javac。它看起來像Javadoc工具內部使用(部分)的javac,但據我所知,我無法控制。 (如果你知道一種方法,通過各種手段,請張貼作爲一個答案!) –

+0

如何使用mvnDebug找出字符串,猶豫不決嗎?這可能會提供一些線索。 –

回答

3

我終於得到了一些時間來研究這又蝕。該maven-javadoc-plugin有益留下target/site/apidocsjavadoc.bat腳本時javadoc.exe過程失敗,我能夠通過修剪在被傳遞到javadoc.exepackages文件列表中找到有問題的包。

有趣的是,有問題的代碼原來是由Google Protocol Buffers編譯器生成的Java源代碼。這很幸運,因爲完全可以從Javadoc中簡單地排除protobuf生成的源代碼是可以接受的。

我加了如下定義,根據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> 
+0

你是如何使用'javadoc.bat'來查找違規類的? –

+1

@ThorbjørnRavnAndersen:現在是幾年前,所以我不確定。但我認爲我做了二分搜索:修剪了一半的包並重試,直到發現包有問題。 –

2

解決方法是爲網站目標創建單獨的配置文件。這樣你可以爲不同的目標定義不同的編譯器。

+0

有趣的想法!但我不確定它會如何工作 - Javadoc工具已經被硬編碼以使用'javac'編譯器。我想我們必須總是使用'mvn clean site'來確保我們沒有任何剩餘的'.class'文件來自另一個編譯器。 –

+0

這不應該是一個問題,除非你在一臺真正的舊電腦上構建一個非常龐大的項目。 – WeMakeSoftware

0

這可能不是一個答案,但只是提出一個想法。

如何在沒有空間的文件夾中安裝JDK(我看到它是C:\ Program Files(x86)...)。Java支持文件名中的空格,但可能是javadoc工具不支持它的一些插件/工具/庫。

+0

有趣的想法,但我不認爲這是問題,因爲在我切換到Eclipse編譯器之前,所有javadoc都生成得很好。 –

1

也許是的javadoc.exe沒有使用相同的JRE Eclipse使用。他們是否安裝了其他JRE?嘗試手動運行javadoc.exe進程並查看它是否執行相同的操作,您可能會得到問題的實際堆棧跟蹤。

0

即時猜測,問題是,javac的,並且使用不同的JDK版本編譯代碼

+1

Eclipse編譯器(ecj)完全不使用JDK,它是一個完全獨立的實現。它使用的只是JRE。 –

相關問題