Некоторые первые тесты показывают, что он не работает (по крайней мере на 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).