Не удается запустить класс Doclet, предоставленный Oracle

#java #javadoc #java-9 #doclet

#java #Javadoc #java-9 #doclet

Вопрос:

Я хочу поэкспериментировать с Doclets (JDK 9), поэтому я попробовал все шаг за шагом, приведенным в этой ссылке. Я не добавил ничего пользовательского в Example класс. Это именно то, что дает Oracle (я только что объявил import s).

Oracle выдает команду:

 javadoc -doclet Example 
       -overviewfile overview.html 
       -sourcepath source-location 
       source-location/Example.java
  

Теперь, когда я запускаю данную команду javadoc, я получаю следующую ошибку:

javadoc: ошибка — Не удается найти пример класса doclet

Я попробовал несколько вариантов команды, поскольку, похоже, это проблема с directors, но все мои попытки завершились неудачей.

Я помещаю Example.java в папку моего рабочего стола: C:UsersGeorgeDesktop

Итак, в моей командной строке я cd C:UsersGeorgeDesktop . Затем javac Example.java (в случае, если он хочет, чтобы он был скомпилирован).

И затем я пробую все следующие команды, получая ту же ошибку.

 javadoc -doclet Example -overviewfile overview.html -sourcepath ./ ./Example.java
  

.

 javadoc -doclet Example -overviewfile overview.html -sourcepath "C:UsersGeorgeDesktop" "C:UsersGeorgeDesktopExample.java"
  

( без кавычек)

javadoc -doclet Example -overviewfile overview.html"C:UsersGeorgeDesktopExample.java"

Я попробовал несколько других вещей, найденных в SO, но опять же, ничего не работает. Чего мне не хватает? Разве приведенный пример не должен работать?

Пример класса (на случай, если вы видите что-то, чего у меня нет):

 public class Example implements Doclet {
    Reporter reporter;
    String overviewFile;

    public static void main(String[] args) {
    }

    public Example() {
        // TODO Auto-generated constructor stub
    }

    @Override
    public void init(Locale locale, Reporter reporter) {
        reporter.print(Kind.NOTE, "Doclet using locale: "   locale);
        this.reporter = reporter;
    }

    public void printElement(DocTrees trees, Element e) {
        DocCommentTree docCommentTree = trees.getDocCommentTree(e);
        if (docCommentTree != null) {
            System.out.println("Element ("   e.getKind()   ": "   e   ") has the following comments:");
            System.out.println("Entire body: "   docCommentTree.getFullBody());
            System.out.println("Block tags: "   docCommentTree.getBlockTags());
        }
    }

    @Override
    public String getName() {
        return "Example";
    }

    @Override
    public Set<? extends Option> getSupportedOptions() {
        Option[] options = { new Option() {
            private final List<String> someOption = Arrays.asList("-overviewfile", "--overview-file", "-o");

            @Override
            public int getArgumentCount() {
                return 1;
            }

            @Override
            public String getDescription() {
                return "an option with aliases";
            }

            @Override
            public Option.Kind getKind() {
                return Option.Kind.STANDARD;
            }

            @Override
            public List<String> getNames() {
                return someOption;
            }

            @Override
            public String getParameters() {
                return "file";
            }

            @Override
            public boolean process(String opt, List<String> arguments) {
                overviewFile = arguments.get(0);
                return true;
            }
        } };
        return new HashSet<>(Arrays.asList(options));
    }

    @Override
    public SourceVersion getSupportedSourceVersion() {
        return SourceVersion.latest();
    }

    @Override
    public boolean run(DocletEnvironment docEnv) {
        reporter.print(Kind.NOTE, "overviewfile: "   overviewFile);
        // get the DocTrees utility class to access document comments
        DocTrees docTrees = docEnv.getDocTrees();

        // location of an element in the same directory as overview.html
        try {
            Element e = ElementFilter.typesIn(docEnv.getSpecifiedElements()).iterator().next();
            DocCommentTree docCommentTree = docTrees.getDocCommentTree(e, overviewFile);
            if (docCommentTree != null) {
                System.out.println("Overview html: "   docCommentTree.getFullBody());
            }
        } catch (IOException missing) {
            reporter.print(Kind.ERROR, "No overview.html found.");
        }

        for (TypeElement t : ElementFilter.typesIn(docEnv.getIncludedElements())) {
            System.out.println(t.getKind()   ":"   t);
            for (javax.lang.model.element.Element e : t.getEnclosedElements()) {
                printElement(docTrees, e);
            }
        }
        return true;
    }
}
  

Комментарии:

1. Вы скомпилировали класс?

2. @JBNizet Oracle в статье ничего не говорится о компиляции. Однако из другого поста SO я это видел, и да, я это сделал. Все то же самое.

Ответ №1:

Запуск javadoc --help показывает следующую опцию:

 -docletpath <path>
              Specify where to find doclet class files
  

Используйте эту опцию, и она должна работать нормально (при условии, что вы скомпилировали класс Example и он действительно находится в каталоге, переданном в качестве аргумента для этой опции).