Lop*_*tun 6 documentation javadoc jar
我必须从myCode.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
Run Code Online (Sandbox Code Playgroud)
看来,javadoc无法在jar中找到源文件.我相信有消息来源.
有什么建议?
一些初步测试表明它不起作用(至少在 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 }
Run Code Online (Sandbox Code Playgroud)
第一种情况适用于您对.java
文件的调用 - 但由于它在文件系统中不作为文件存在(new File(name).exists()
返回 false),因此这没有帮助,您会得到第三种情况,并出现“文件未找到”错误。
看起来当用更合适的条件替换这种条件时它可以工作(例如!fm.getJavaFileObjects(name).isEmpty()
- 假设上下文是用 JavaFileManager 初始化的,它实际上在 jar/zip 文件中查找,我现在没有检查。
因此,您要么解压源 jar,要么修补 javac 实现(最好将其贡献给主 javac 源)。