如何在.jar文件中从源代码构建javadoc?

6
我需要从包含源代码和类文件的myCode.jar构建Javadoc。 我能否在不提取jar文件的情况下完成?
根据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无法在jar文件中找到源文件。我相信源文件是存在的。
有任何建议吗?

请再次确认该jar文件是否确实包含源文件(可以将其作为zip文件进行打开)。 您还可以尝试将"net\kem..."中的反斜杠改为点号,或者干脆删除它。 - mikek3332002
1个回答

3
一些初步测试表明它不起作用(至少在我这里的OpenJDK 1.6.0_20上)。
因此,我查看了源代码(在Mercurial Web界面中可以浏览)。 Javadoc(版本可能与我这里的版本不同)使用了Javac的一些部分来进行操作,看起来两者都使用javax.tools.JavaFileManager接口实现对其源文件的访问,特别是在子接口StandardJavaFileManager中。 该接口声称能够访问zip文件条目:

此文件管理器创建表示常规文件、zip文件条目或类似基于文件系统的容器中的条目的文件对象。

但以下是它的用法(在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源代码)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接