0

我准备了一个非常简单的演示,说明我想在更大范围内做什么来演示这个问题:

配置:java 1.8、maven 3.3.9、maven-javadoc-plugin 3.0.1

我有 Maven 工件 testA、testB 和 testC。组件 testA 是一个 javadoc 聚合器项目。B 类(位于 testB 组件中)导入并实例化 C 类(位于 testC 组件中)。

testA 直接依赖于 testB,而 testB 直接依赖于 testC(都提供了范围),因此 testA 对 testC 有传递依赖。

此外,B 类使用自定义 javadoc 标记进行标记。

由于我没有编写 doclet 的经验,所以我使用了在 Internet 上找到的一个 doclet,并根据我的需要对其进行了修改(基本上我只是重写了 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); 

似乎没有要处理的包裹。但是,我确信 doclet 在单个组件上执行时会按预期工作(非聚合使用,在没有 maven 的情况下尝试 - javadoc cmd)。当我使用标准 doclet 时,整个聚合也可以工作,但这对我没有用,因为我真的只需要包含标记的类。

这是我的聚合器的 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>

我究竟做错了什么?有人可以帮我吗?

4

1 回答 1

0

实际上,我设法使它工作。问题出在 doclet 代码上。我不知道 javadoc 如何处理代码元素。

有一个以 RootDoc 节点开始的树结构。从那里它把这棵树往下走。RootDoc -> 包 -> 类 -> 成员等。由于我只处理标记类,因此跳过了其他所有内容。因此,递归在一开始就被破坏了——PackageDoc 元素都没有通过条件,所以最后什么都没有处理。

我可以为 javadoc 存储(包含)我想要的任何内容,但是无论处理哪种类型的元素,我都必须确保递归继续进行。

于 2018-09-26T07:47:36.790 回答