我开发了一个自定义javadoc标记,它通过API使用反射来获取有关在其中引用标记的类的信息。它使用" Class.forName(String)
"。
我能够在taglet本身的项目中使用它,甚至可以使用" ToolProvider.getSystemDocumentationTool()
"运行集成测试。并验证结果内容。
我现在已经在nexus服务器中安装了这个工件,并且我试图从使用Maven和maven-javadoc-plugin
构建的类中引用它。
当我第一次运行我的标签在" Foo.java"中引用的构建时,我在我的taglet代码中看到了一个ClassNotFound异常,说它无法找到指定的类。
这告诉我它已进入我的taglet代码,但它无法加载相关类的类文件。这有点具有讽刺意味,因为它可以通过查找和解析与该类关联的源文件来实现此目的。
所以,然后我编辑了maven-javadoc-plugin配置,添加了" additionalDependencies
"阻止,指定包含引用该标记的类文件的工件。
我还设置了" verbose
"标志,我在结果输出中看到,当它打印了" search path for class files
"时,我在该列表的末尾找到了有问题的类的工件jar。
但是,我仍然收到错误。
这里还有什么可能出错?
以下是相关代码的一些摘录:
<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类中代码的一部分,它显示了包含类的加载:
@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]
我在列表末尾检查了jar,并确认有问题的课程在那里。
答案 0 :(得分:0)
我决定添加&#34; additionalDependency&#34;似乎没有什么我能看到的。
重要的是,我没想到的是将依赖项添加为另一个&#34; tagletArtifact&#34;。我想如果你考虑一下,它是taglet所需的依赖。当我为POM本身正在制作的工件添加GAV时,这终于奏效了。