使用 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 时,这终于奏效了。
我开发了一个自定义 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 时,这终于奏效了。