2012-09-27 52 views
2

這個可能是是一個doclet實現特定的問題,但我相信它真的是我在這裏處理的一個JavaDoc配置問題。使用特殊文檔運行Javadoc時出現模糊的IOException

我試圖讓yDoc UML Doclet工作,以便它將爲我的Java應用程序生成UML圖,作爲Ant構建的一部分。我下載了該項目(社區版),並試圖修改它們的build-sample.xml,但無法完成它的工作。

這裏是我的項目目錄結構:

MyProject/ 
    src/main/java/ 
     <All the Java sources I want documented and diagrammed> 
    bin/main 
     <Compiled binaries of src/main/java/> 
    lib/ 
     styleed.jar 
     ydoc.jar 
    resources/ 
     <All the yDoc resources that came with the download> 
    umldoclet/ 
     <Where I want all JavaDocs to go> 
    build.xml 

這裏的build.xml

<project name="MyProject" default="ydoc" basedir="." xmlns:ivy="antlib:org.apache.ivy.ant" xmlns:jacoco="antlib:org.jacoco.ant"> 

    <!-- The "compile" task and all its dependencies omitted for brevity, 
     but they all absolutely work 100% and "compile" places compiled 
     CLASS files under bin/main. --> 

    <target name="ydoc" depends="compile"> 
     <property name="ydoc.home" value="${basedir}"/> 

     <javadoc source="1.5" destdir="./umldoclet" additionalparam="-breakiterator"> 
      <packageset dir="src/main"> 
       <include name="java/**"/> 
      </packageset> 
      <doclet name="ydoc.doclets.YStandard" path="${ydoc.home}/lib/ydoc.jar;${ydoc.home}/resources"> 
       <param name="-author"/> 
       <param name="-generic"/> 
       <param name="-umlautogen"/> 
       <param name="-filterpath" value="./lib/ydoc.jar"/> 
       <param name="-filter" value="ydoc.filters.ExcludeFilter"/> 
       <param name="-tag" value="y.precondition"/> 
       <param name="-tag" value="y.postcondition"/> 
       <param name="-tag" value="y.complexity"/> 
       <param name="-tag" value="param"/> 
       <param name="-tag" value="return"/> 
       <param name="-tag" value="see"/> 
       <param name="-tag" value="y.uml"/> 
      </doclet> 
     </javadoc> 
    </target> 
</project> 

當我運行ydoc任務,甚至在與-v說法「詳細」模式下運行的螞蟻,我看到了[ydoc]在Ant控制檯中調用的任務,後面跟着一條記錄語句,其中顯示「生成Javadoc」,並且從詳細輸出中返回大約20行,並返回參數yDoc我,然後最後的日誌消息說「Javadoc執行」。然後,以下令人震驚渺IOException

BUILD FAILED 
<my-eclipse-home>/MyProject/build.xml:200: Javadoc failed: java.io.IOException: Cannot run program "javadoc": java.io.IOException: error=2, No such file or directory 
    at org.apache.tools.ant.taskdefs.Javadoc.execute(Javadoc.java:1765) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:616) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.Target.execute(Target.java:392) 
    at org.apache.tools.ant.Target.performTasks(Target.java:413) 
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399) 
    at org.apache.tools.ant.Project.executeTarget(Project.java:1368) 
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 
    at org.eclipse.ant.internal.launching.remote.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32) 
    at org.apache.tools.ant.Project.executeTargets(Project.java:1251) 
    at org.eclipse.ant.internal.launching.remote.InternalAntRunner.run(InternalAntRunner.java:424) 
    at org.eclipse.ant.internal.launching.remote.InternalAntRunner.main(InternalAntRunner.java:138) 
Caused by: java.io.IOException: Cannot run program "javadoc": java.io.IOException: error=2, No such file or directory 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:475) 
    at java.lang.Runtime.exec(Runtime.java:610) 
    at org.apache.tools.ant.taskdefs.Execute$Java13CommandLauncher.exec(Execute.java:862) 
    at org.apache.tools.ant.taskdefs.Execute.launch(Execute.java:481) 
    at org.apache.tools.ant.taskdefs.Execute.execute(Execute.java:495) 
    at org.apache.tools.ant.taskdefs.Javadoc.execute(Javadoc.java:1759) 
    ... 15 more 
Caused by: java.io.IOException: java.io.IOException: error=2, No such file or directory 
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:164) 
    at java.lang.ProcessImpl.start(ProcessImpl.java:81) 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:468) 
    ... 20 more 

有沒有什麼辦法讓更多的細節了螞蟻的?找出它在異常中引用的文件或目錄?任何JavaDoc/yDoc大師都曾經遇到過這種情況?我的項目目錄結構是否設置錯誤,或者與Ant構建版本不同?我相信我有我的doclet/path屬性設置正確,並使用正確的路徑分隔符(我在Ubuntu Linux上)。對於我的生活,我無法弄清楚從哪裏出發,或者如何去診斷這裏的潛在問題!提前致謝!

編輯/更新

感謝大家迄今的建議。我完全不用Eclipse了(就構建而言,只需從命令行運行Ant;現在就可以了,當我這樣做的時候,我得到了一個成功的構建(所以Eclipse至少部分是罪魁禍首) 。),但仍然沒有yDoc代

現在,當我從與verbos終端運行Ant(-v)選項,這裏是我所看到的:

數百個外觀相同的警告,但不同類別:

[javadoc] Constructing Javadoc information... 
[javadoc] /<path-to-my-project>/MyProject/src/main/java/com/some/pkg/SomeObject.java:11: package org.springframework.beans.factory.annotation does not exist 
[javadoc] import org.springframework.beans.factory.annotation.Autowired; 
[javadoc]             ^

經過數百次之後,我得到以下輸出(其中1個用於我的源代碼樹中的每個包) :

[javadoc] javadoc: warning - No source files for package java.com.some.pkg.<whatever> 

末,冗長的構建輸出的最後一節:

[javadoc] Valid license file found. 
[javadoc] Registered Filter ydoc.filters.ExcludeFilter ... 
[javadoc] Registered Taglet for tag @y.complexity ... 
[javadoc] Registered Taglet for tag @y.precondition ... 
[javadoc] Registered Taglet for tag @y.postcondition ... 
[javadoc] Registered Taglet for tag @y.author ... 
[javadoc] 1 error 
[javadoc] 109 warnings 
[javadoc] javadoc: error - No public or protected classes found to document. 

BUILD SUCCESSFUL 
Total time: 6 seconds 

此外,如果被正確執行,它應該是地方所有uml-doclet/目錄下的JavaDoc在我的項目的根。它沒有這樣的事情!

所以它看起來像有幾個事情在進行:

  1. 的JavaDoc中不能看到我的第三方的依賴(如Spring,駱駝等);因此數百警告
  2. 它無法找到的名單我的任何資源記錄

再次,賞金去的人誰可以幫助我得到這個工作。再次感謝所有幫助!

+0

你有自己的Javadoc你的$ PATH? – Thilo

+0

什麼是快速檢查方法?!? – IAmYourFaja

+0

在命令行中鍵入'javadoc'。 – Thilo

回答

3

如果用-verbose -debug執行螞蟻你要麼看到這幾行:

Setting project property: ydoc.home -> /var/tmp/ydoc-test 
    [javadoc] scanning /var/tmp/ydoc-test/src/main for packages. 
dirset: Setup scanner in dir /var/tmp/ydoc-test/src/main with patternSet{ includes: [java/**] excludes: [] } 
    [javadoc] Generating Javadoc 
    [javadoc] Executing '/usr/lib/jvm/java-7-openjdk-amd64/bin/javadoc' with arguments: 
    [...] 

或者,你會看到這幾行:

Setting project property: ydoc.home -> /var/tmp/ydoc-test 
    [javadoc] scanning /var/tmp/ydoc-test/src/main for packages. 
dirset: Setup scanner in dir /var/tmp/ydoc-test/src/main with patternSet{ includes: [java/**] excludes: [] } 
    [javadoc] Generating Javadoc 
    [javadoc] Executing 'javadoc' with arguments: 

在第一種情況下的Eclipse /螞蟻已經找到了有效的javadoc命令,並在行[javadoc] Executing >FULL_PATHNAME_TO_JAVADOC>中告訴你。在第二種情況下,它只會談到沒有任何路徑名的javadoc,調試輸出將在稍後顯示您的例外情況。

我假設你的情況是第二個,但請檢查它!

如果Eclipse/Ant不知道javadoc的位置,首先應該通過將Eclipse排除在等式之外來簡化事情:使用命令行並檢查鍵入這些命令是否導致「找不到命令」消息:

java 
javac 
javadoc 

我認爲第一個是OK(畢竟,你可以運行Eclipse如圖你蹤跡)。如果找不到第二個和第三個命令,那麼您的計算機上尚未安裝JDK,但只安裝了JRE。安裝一個並重新啓動Eclipse。

另一方面如果發現javac但不是javadoc,那麼您的JDK已損壞。

如果找到javacjavadoc,那麼Eclipse根本不知道它。但在此之前要回到Eclipse在命令shell中鍵入一個命令:

readlink -m $(which javadoc)/../.. 

記住路徑readlink給你。

在Eclipse轉到 「窗口 - >首選項 - >爪哇 - >已安裝的JRE」。在列表中選中具有選中複選框的條目,然後按「編輯」。若線「JRE家」是不一樣的readlink給你的路徑,那麼很有可能你的Eclipse被配置爲只使用本地JRE,但不是你的JDK安裝。

如果是這樣的話,那麼取消「編輯」對話框中,按「添加」,選擇「標準VM」並輸入路徑readlink給你。正確輸入該路徑後,Eclipse應該爲你填寫其他字段,因此你可以說「OK」。返回到新項目的「Installed JRE」列表中。

javadoc任務本身應該開始之後。

編輯

但是你需要一些更多的調整:

第一:在這一部分:

 <packageset dir="src/main"> 
      <include name="java/**"/> 
     </packageset> 

你混合源directoy和包裝部分。它應該是:

 <packageset dir="src/main/java"> 
     </packageset> 

另外javadoc喜歡有權訪問被引用的類。因此,您應該將用於編譯代碼的相同類路徑添加到javadoc中。所以</packageset>之後添加適當的<classpath>部分。這將處理「xyz包不存在」警告。

+0

謝謝@ A.H。 (+1) - 請參閱我上面的編輯/更新! – IAmYourFaja

+0

@ 4herpsand7derpsago:我已經爲下一個障礙更新瞭解決方案。 –

+0

yeeeeeeaaaaahhhhh budddddyyy !!!!任務完成。 **謝謝。** – IAmYourFaja

3

它看起來像螞蟻未能找到javadoc二進制文件。我不認爲ant使用定義的PATH來查找javadoc二進制文件(文檔說它使用與螞蟻使用的相同的JDK)。

一些事情,我會嘗試是:

  • 可執行屬性添加到任務,指向一個javadoc二進制文件(我並不是說這是一個正確的解決方案,但如果它工程,這意味着有一個問題,從螞蟻正在尋找默認位置)。
  • 確保您的JAVA_HOME和PATH指向JDK而不是JRE
  • 確保您的JAVA_HOME指向您的PATH所指向的同一個java安裝。
+0

謝謝@Augusto(+1) - 請參閱我上面的編輯/更新! – IAmYourFaja

0

我會在你的build.xml文件更改這些行:

<packageset dir="src/main/java"> 
    <include name="**" /> 
</packageset> 
相關問題