5

I wrote a doclet that collects some data and passes it to a reporter. I want this reporter to be exchangeable. I tried to add a reporter implementation to the doclet classpath using an additionalDependency and/or a pluginDependency. I can't load the reporter implementation with the Java 6 service loader and it also doesn't work to get the class using the doclets class loader or the threads context class loader.

How can I get the test.TestReporterImpl into the test-doclet classpath?

In the doclet:

apiReporterServiceLoader = ServiceLoader.load(TestReporter.class); // test.TestReporter

apiReporterServiceLoader.iterator().hasNext(); // false

Thread.currentThread().getContextClassLoader().loadClass("test.TestReporterImpl"); // ClassNotFoundException

getClass().getClassLoader().loadClass("test.TestReporterImpl"); // ClassNotFoundException

in the pom executing the doclet

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>2.10.3</version>
    <executions>
        <execution>
            <id>run-my-doclet</id>
            <goals>
                <goal>javadoc</goal>
            </goals>
            <phase>generate-resources</phase>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>test</groupId>
            <artifactId>test-doclet-test-reporter</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
    <configuration>
        <doclet>test.TestDoclet</doclet>
        <docletArtifact>
            <groupId>test</groupId>
            <artifactId>test-doclet</artifactId>
            <version>${project.version}</version>
        </docletArtifact>
        <additionalDependencies>
            <additionalDependency>
                <groupId>test</groupId>
                <artifactId>test-doclet-test-reporter</artifactId>
                <version>${project.version}</version>
            </additionalDependency>
        </additionalDependencies>
        <useStandardDocletOptions>false</useStandardDocletOptions>
    </configuration>
</plugin>

test-doclet-test-reporter/src/main/resources/META-INF/services/test.TestReporter

test.TestReporterImpl
messivanio
  • 2,089
  • 16
  • 24
Sven Tschui
  • 1,109
  • 6
  • 17

1 Answers1

1

You'd have to specify the directory to be included in your class path by adding the following to your POM anywhere under build. This is true for your classes under the meta-inf folder under resource, in cases of bugs to pick up from the default implicit resource folder.

 <project>
     ...
     <build>
       ...
       <resources>
         <resource>
           <directory>[your folder containing the class or to be in the classpath here]</directory>
         </resource>
       </resources>
       ...
     </build>
     ...
    </project>
messivanio
  • 2,089
  • 16
  • 24
Milind J
  • 529
  • 5
  • 10
  • Which resources are you referring to? All resources are on classpath. The problem is the plugin depenency / additionalDependency is not on the doclet's classpath – Sven Tschui May 21 '15 at 06:18
  • Even though the resource dir should be ideally part of the class path and be included in final generated jars, I had a similar problem where I had to mention a properties file explicitly in resources under sub directory to be included in my final jar (using the shade plugin). Finally I tried to include it by explicitly specifying resource folder under the pom.xml resources tag and it worked. Conversely if I removed the explicit declaration, the properties file was not part of the final jar. – Milind J May 21 '15 at 23:45
  • my use case is that I want the second jar exchangeable. My resources are on classpath but the second jar doesn't get added to the cp by the doclet plugin – Sven Tschui May 22 '15 at 06:18
  • Ok, If I were you I would try adding it as a dependency. Force it to be in the classpath using poms other options like of resources / dependancies. – Milind J May 22 '15 at 06:47
  • 1
    I can't get the jar on the classpath of the doclet. Whether as regular dependency, plugin dependency nor as additionalDependency – Sven Tschui May 25 '15 at 10:07