私は、タグレットが参照するクラスに関する情報を取得するためにAPIを介してリフレクションを使用するカスタムjavadocタグレットを開発しました。 "Class.forName(String)
"のクラスをロードします。maven-javadoc-pluginを使用して、タグレット参照が含まれるクラスを読み込む方法は?
「ToolProvider.getSystemDocumentationTool()
」を使用して統合テストを実行し、その結果の内容を検証する時点でも、これをタグレット自体のプロジェクトで使用することができました。
私はこのアーティファクトをネクサスサーバにインストールしました。Mavenとmaven-javadoc-plugin
で構築されたクラスからこのアーティファクトを参照しようとしています。
"Foo.java"でmyタグが参照されたビルドを初めて実行したとき、タグレットコードで指定されたクラスが見つからないというClassNotFound例外が発生しました。
これは私のタグレットのコードに入っていることを示していますが、問題のクラスのクラスファイルを読み込むことができません。これは皮肉なことです。ここに入る唯一の方法は、クラスに関連付けられたソースファイルを見つけて解析することです。
そこで、 "additionalDependencies
"ブロックを追加して、タグを参照するクラスファイルを含む成果物を指定して、maven-javadoc-plugin設定を編集しました。
また、 "verbose
"フラグを設定し、結果出力で "search path for class files
"を印刷したときに、そのリストの末尾に該当するクラスのアーティファクトジャーが見つかりました。
ただし、まだエラーが発生しています。
ここで何が間違っている可能性がありますか?ここで
は、関連するコードの一部抜粋です:私は、ビルドを実行すると、私は、
@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);
:
<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>
はここ含むクラスのロードを示しタグレットクラスのコードの一部ですこの出力を参照してください:
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)
そして、次の行が出力に表示されました(詳細はon):
[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ファイルを検査し、問題のクラスがそこにあることを確認しました。