使用 maven-javadoc-plugin,如何加载包含 taglet 引用的 class?

with maven-javadoc-plugin, how to load the class that taglet reference is contained within?

我开发了一个自定义 javadoc taglet,它通过 API 使用反射来获取有关 class taglet 在其中被引用的信息。它用“Class.forName(String)”加载 class。

我能够让它在 taglet 本身的项目中工作,甚至达到 运行 使用“ToolProvider.getSystemDocumentationTool()”进行集成测试并验证结果内容的程度。

我现在已经在我们的 Nexus 服务器中安装了这个工件,我正在尝试从使用 Maven 构建的 class 和 maven-javadoc-plugin.

中引用它

当我第一次 运行 在 "Foo.java" 中引用我的标签的构建时,我在我的 taglet 代码中看到一个 ClassNotFound 异常,说它找不到指定的 class .

这告诉我它正在进入我的 taglet 代码,但它无法为有问题的 class 加载 class 文件。这有点讽刺,因为它到达这里的唯一方法是查找和解析与 class.

关联的源文件

因此,我随后编辑了 maven-javadoc-plugin 配置,添加了一个“additionalDependencies”块,指定包含引用该标记的 class 文件的工件。

我还设置了“verbose”标志,我在结果输出中看到,当它打印“search path for class files”时,我找到了带有 class 在该列表的末尾有问题。

但是,我仍然遇到错误。

这里还有什么问题?

以下是相关代码的一些摘录:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>2.10.4</version>
            <configuration>
                <verbose>true</verbose>
                <additionalDependencies>
                    <additionalDependency>
                        <groupId>our.group.id</groupId>
                        <artifactId>our.artifact.id</artifactId>
                        <version>${current.pom.version}</version>
                    </additionalDependency>
                </additionalDependencies>
                <additionalparam>-Xdoclint:none</additionalparam>
                <taglets>
                    <taglet>
                        <tagletClass>packagepath.taglet.ValidationConstraintsTaglet</tagletClass>
                    </taglet>
                    <taglet>
                        <tagletClass>packagepath.taglet.ValidationConstraintsCombinedTaglet</tagletClass>
                    </taglet>
                </taglets>
                <tagletArtifact>
                    <groupId>our.group.id.taglets</groupId>
                    <artifactId>validationJavadocTaglet</artifactId>
                    <version>0.0.1-SNAPSHOT</version>
                </tagletArtifact>
            </configuration>
            <executions>
                <execution>
                    <id>module-javadoc-jar</id>
                    <phase>package</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <show>protected</show>
                        <detectLinks>false</detectLinks>
                    </configuration>
                </execution>
            </executions>
        </plugin>

这是 Taglet class 中的部分代码,显示包含 class:

的加载
@Override
public String toString(Tag tag) {
    String  className   = tag.holder().toString();

    StringBuilder   sb  = new StringBuilder();
    sb.append("<dt><b>Validation Constraints</b></dt>");
    sb.append("<dd>");
    sb.append("<table border=1><thead><tr><th>Property</th><th>Message</th></tr></thead>");
    sb.append("<tbody>");

    try {
        Class<?>    clazz   = Class.forName(className);

当我 运行 构建时,我看到这个输出:

Generating C:\...\...\target\apidocs\help-doc.html...
[done in 2593 ms]
[WARNING] Javadoc Warnings
[WARNING] java.lang.ClassNotFoundException: ...Foo
[WARNING] at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
[WARNING] at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
[WARNING] at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
[WARNING] at java.lang.Class.forName0(Native Method)
[WARNING] at java.lang.Class.forName(Class.java:264)
[WARNING] at ....taglet.ValidationConstraintsTaglet.toString(ValidationConstraintsTaglet.java:69)

而且我注意到输出中有以下行(详细已打开):

[search path for class files: C:\Program Files\Java\jdk1.8.0_102\jre\lib\resources.jar,...,C:\...\our.artifact.id\target\our.artifact.id-2.7.0-SNAPSHOT.jar]

我检查了列表末尾的罐子,确认存在问题的 class。

我确定添加 "additionalDependency" 似乎没有任何我能看到的东西。

我没想到的是,重要的是将依赖项添加为另一个 "tagletArtifact"。我想如果你考虑一下,它是 taglet 所需的依赖项。当我为 POM 本身正在生成的工件添加 GAV 时,这终于奏效了。