我已经准备了一个非常简单的演示,演示了我想做的更大的事情以演示该问题:
配置: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具有传递依赖。
此外,使用自定义的javadoc标记来标记B类。
由于我没有编写doclet的经验,因此我使用了doclet I found on the internet并对其进行了修改(基本上我只是重写了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)。当我使用Standard 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>
我在做什么错?有人可以帮我吗?
答案 0 :(得分:0)
实际上,我设法使它起作用。问题出在doclet代码上。我不知道javadoc如何处理代码元素。
有一个从RootDoc节点开始的树结构。从那里走下来,这棵树。 RootDoc->包->类->成员等 由于我仅处理标记的类,因此其他所有内容均被跳过。因此,递归从一开始就被打破了-PackageDoc元素都没有通过条件,因此最后没有任何处理。
我可以存储(包括)我想要的javadoc,但是无论处理哪种类型的元素,我都必须确保递归继续进行。