2010-03-01 58 views
6

我必須從myCode.jar構建Javadoc,它包含源文件和類文件。 我可以在不提取罐子的情況下做到嗎?如何從.jar文件中的源代碼構建javadoc?

根據http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/javadoc.html#classpath我應該能夠做到這樣:C:\>javadoc -d docs -classpath myCode.jar net\kem\jmx\CacheManagerMBean.java 不過,我得到以下錯誤:

javadoc: error - File not found: "net\kem\jmx\CacheManagerMBean.java" 
[search path for source files: [myCode.jar]] 
[search path for class files: [C:\Program Files\Java\jdk1.5.0_17\jre\lib\rt.jar, C:\Program Files\Java\jdk1.5.0_17\jre\lib\jsse.jar, 
C:\Program Files\Java\jdk1.5.0_17\jre\lib\jce.jar, C:\Program Files\Java\jdk1.5.0_17\jre\lib\charsets.jar, C:\Program Files\Java\jd 
k1.5.0_17\jre\lib\ext\dnsns.jar, C:\Program Files\Java\jdk1.5.0_17\jre\lib\ext\localedata.jar, C:\Program Files\Java\jdk1.5.0_17\jre 
\lib\ext\sunjce_provider.jar, C:\Program Files\Java\jdk1.5.0_17\jre\lib\ext\sunpkcs11.jar, C:\Projects\RenderClusterController\WebCo 
ntent\WEB-INF\lib\makoRenderJMX.jar]] 
[done in 360 ms] 
1 error 

看來,javadoc中無法找到罐子內的源文件。我相信,消息來源在那裏。

有什麼建議嗎?

+0

double檢查jar是否包含源文件(將其作爲zip文件打開文件) 您可能還想嘗試將網\ kem ...調整爲點而不是\或將其全部刪除 – mikek3332002 2010-05-22 09:14:17

回答

3

一些第一次測試表明它不起作用(至少在OpenJDK 1.6.0_20上,我在這裏)。

因此,我查看了源代碼(可在mercurial web-interface中瀏覽)。 Javadoc(在那裏的版本,可能與我在這裏的版本不同)在其操作中使用了相當多的Javac位,並且它看起來像兩個都使用接口來實現對其源文件的訪問,特別是在子接口StandardJavaFileManager

This interface聲稱能夠訪問ZIP文件條目:

This file manager creates file objects representing regular files, zip file entries, or entries in similar file system based containers.

但在這裏它是如何使用(在JavaDocTool.getRootDocImpl()):

148     String name = it.head; 
    149     if (!docClasses && name.endsWith(".java") && new File(name).exists()) { 
    150      JavaFileObject fo = fm.getJavaFileObjects(name).iterator().next(); 
    151      docenv.notice("main.Loading_source_file", name); 
    152      JCCompilationUnit tree = parse(fo); 
    153      classTrees.append(tree); 
    154     } else if (isValidPackageName(name)) { 
    155      names = names.append(name); 
    156     } else if (name.endsWith(".java")) { 
    157      docenv.error(null, "main.file_not_found", name); 
    158     } else { 
    159      docenv.error(null, "main.illegal_package_name", name); 
    160     } 

第一種情況,在您的通話應用與.java文件 - 但由於它不作爲文件系統中的文件存在(new File(name).exists()返回false),所以這並沒有幫助,而是取而代之的是第三種情況,出現「文件未找到」錯誤。

它看起來可能更適合的一個替代這種情況下,當工作(如!fm.getJavaFileObjects(name).isEmpty() - 提供的上下文與JavaFileManager這實際上看起來的jar/zip文件,這是我到現在也沒檢查初始化

因此,你需要解壓你的源代碼jar,或者修補你的javac實現(最好將其貢獻給主要的javac源代碼)。