Maven: зависимая от Javadoc агрегация и пользовательский доклет

Я подготовил очень простую демонстрацию того, что я хотел бы сделать в гораздо большем масштабе, чтобы продемонстрировать проблему:

Конфигурация: Java 1.8, Maven 3.3.9, Maven-Javadoc-плагин 3.0.1

У меня есть артефакты maven testA, testB и testC. Компонент testA - это проект агрегатора javadoc. Класс B (находится в компоненте testB) импортирует и создает экземпляр класса C (находится в компоненте testC).

testA имеет прямую зависимость от testB, а testB напрямую зависит от testC (оба с предоставленной областью), поэтому testA имеет транзитивную зависимость от testC.

Кроме того, класс B помечен пользовательским тегом Javadoc.

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

Как упомянуто выше, testA является агрегатором, который предназначен для сбора источников зависимостей только из прямых (нетранзитивных) зависимостей и создания Javadoc только для помеченных классов. Это требует любых прямых зависимостей для объединения их исходных кодов во время сборки, поэтому я использую maven-source-plugin для генерации исходного артефакта из компонента testB.

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

[ERROR] java.lang.ArrayIndexOutOfBoundsException: 0
[ERROR] at com.sun.tools.doclets.formats.html.ConfigurationImpl.setTopFile(ConfigurationImpl.java:537)

Исключение относится к этой строке:

this.topFile = DocPath.forPackage(this.packages[0]).resolve(DocPaths.PACKAGE_SUMMARY); 

Кажется, что нет пакета для обработки. Однако я уверен, что доклет работает как задумано, когда выполняется на одном компоненте (использование без агрегации, пробовал без maven - javadoc cmd). Кроме того, вся функция агрегации работает, когда я использую стандартный доклет, но для меня это бесполезно, поскольку мне действительно нужно включать только помеченные классы.

Вот POM.xml моего агрегатора:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>test</groupId>
  <artifactId>testA</artifactId>
  <version>1</version>

  <dependencies>

    <dependency>
        <groupId>com.sun</groupId>
        <artifactId>tools</artifactId>
        <version>1.8</version>
        <scope>system</scope>
        <systemPath>${java.home}/../lib/tools.jar</systemPath>
    </dependency>

    <dependency>
        <groupId>test</groupId>
        <artifactId>testB</artifactId>
        <version>1</version>
        <scope>provided</scope>
    </dependency>

  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>3.0.1</version>
        <configuration>

          <destDir>testOutput</destDir>
          <includeDependencySources>true</includeDependencySources>
          <doclet>com.test.MyDoclet</doclet>

          <docletArtifact>
            <groupId>test</groupId>
            <artifactId>my-doclet-artifact</artifactId>
            <version>1</version>
          </docletArtifact>

          <useStandardDocletOptions>true</useStandardDocletOptions>

          <tags>
            <tag>
              <name>MyTag</name>
            </tag>
          </tags>

        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

Что я делаю неправильно? Может ли кто-нибудь помочь мне, пожалуйста?

1 ответ

Решение

На самом деле мне удалось заставить его работать. Проблема была с кодом доклета. Я не знал, как Javadoc обрабатывает элементы кода.

Существует древовидная структура, начинающаяся с узла RootDoc. Оттуда идет это дерево вниз. RootDoc ​​-> пакеты -> классы -> члены и т. Д. Так как я обрабатывал только помеченные классы, все остальное было пропущено. Таким образом, рекурсия была нарушена в самом начале - ни один из элементов PackageDoc не прошел условие, поэтому ничего не было обработано в конце.

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

Другие вопросы по тегам