2017-07-17 6 views
0

Ich habe ein benutzerdefiniertes Javadoc-Taglet entwickelt, das die Reflektion über eine API verwendet, um Informationen über die Klasse zu erhalten, auf die das Taglet verweist. Es lädt die Klasse mit "Class.forName(String)".mit maven-javadoc-plugin, wie kann man die Klasse laden, in der der Taglet-Verweis enthalten ist?

Ich konnte dies im Projekt für das Taglet selbst funktionieren, sogar bis zu dem Punkt der Durchführung von Integrationstests mit "ToolProvider.getSystemDocumentationTool()" und die Überprüfung des resultierenden Inhalts.

Ich habe dieses Artefakt jetzt in unserem Nexus-Server installiert, und ich versuche, es von einer Klasse zu referenzieren, die mit Maven und der maven-javadoc-plugin erstellt wurde.

Als ich das Build zum ersten Mal ausführte, wo mein Tag in "Foo.java" referenziert wurde, sah ich in meinem Taglet-Code eine ClassNotFound-Ausnahme, die die angegebene Klasse nicht finden konnte.

Das sagt mir, dass es in meinen Taglet-Code gelangt, aber es ist nicht in der Lage, die Klassendatei für die betreffende Klasse zu laden. Dies ist eine Art Ironie, da der einzige Weg, den es hier erreichen könnte, darin besteht, die mit der Klasse assoziierte Quelldatei zu finden und zu analysieren.

Also habe ich dann die maven-javadoc-plugin-Konfiguration bearbeitet und einen "additionalDependencies" -Block hinzugefügt, der das Artefakt spezifiziert, das die Klassendatei enthält, die auf das Tag verweist.

Ich legte auch die "" -Flag, und ich sah, dass in der resultierenden Ausgabe, wenn es die "search path for class files" ausgedruckt, fand ich das Artefakt Jar mit der betreffenden Klasse am Ende dieser Liste.

Allerdings bekomme ich immer noch den Fehler.

Was könnte hier noch schief gehen?

Hier einige Auszüge aus relevanten Code:

 <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> 

Hier ist ein Teil des Codes in der Taglet Klasse, die die Belastung der enthaltenden Klasse zeigt:

@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); 

Wenn ich den Build ausführen, ich siehe diese Ausgabe:

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) 

Und ich bemerkte die folgende Zeile in der Ausgabe (ausführlich ist 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] 

Ich inspiziert das Glas am Ende der Liste und verifiziert, dass die betreffende Klasse da ist.

Antwort

0

Ich festgestellt, dass das Hinzufügen einer "additionalDependency" scheint nichts zu tun, was ich sehen kann.

Was wichtig ist, was ich nicht erwartet habe, war, die Abhängigkeit als ein weiteres "tagletArtifact" hinzuzufügen. Ich nehme an, wenn Sie darüber nachdenken, ist es eine Abhängigkeit, die das Taglet benötigt. Als ich den GAV für das Artefakt, das das POM selbst produziert, hinzugefügt habe, hat das schließlich funktioniert.

Verwandte Themen