Как собрать Javadoc из источников в файле .jar? - PullRequest
6 голосов
/ 01 марта 2010

Мне нужно собрать Javadoc из myCode.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 не может найти исходные файлы в банке. Я уверен, что источники там.

Есть предложения?

1 Ответ

3 голосов
/ 25 февраля 2011

Некоторые первые тесты показывают, что он не работает (по крайней мере на OpenJDK 1.6.0_20, который у меня здесь).

Итак, я посмотрел на источник (просматриваемый в веб-интерфейсе mercurial ). 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).

...