Как я могу скомпилировать и запустить свой класс Custom Doclet в моем проекте?

Я пытаюсь сбросить весь комментарий javadoc класса (предпочтительно подклассы библиотечного класса WebPage) во время компиляции в файл.properties в формате classname=comment,

Пока что у меня есть:

  • создан класс доклета SiteMapDoclet
    • класс определен для сканирования всех javadocs в проекте и вывода их в файл.properties
  • Добавил необходимые конфиги в мой pom.xml, чтобы он работал.

Версии: Java 1.6.0.21, Maven 2.2.1

Проблема:
mvn site возвращает:

Embedded error: Error rendering Maven report: 
Exit code: 1 - java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
    at us.ak.state.revenue.cssd.Personnel.utils.SiteMapDoclet.<clinit>(SiteMapDoclet.java:27)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)

Я попытался установить банки как AdditionalDependencies хотя они являются нормальными зависимостями для моего проекта. Я также попытался добавить пути к банкам, которые, как я ожидаю, понадобятся моему классу как часть пути загрузки.

раздел отчетов моего pom.xml выглядит так:

<reporting>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-javadoc-plugin</artifactId>
      <version>2.9</version>
      <reportSets>
        <reportSet>
          <id>html</id>
          <reports>
            <report>javadoc</report>
          </reports>
        </reportSet>
        <reportSet>
          <id>siteMap</id>
          <configuration>
            <doclet>
              us.ak.state.revenue.cssd.Personnel.utils.SiteMapDoclet
            </doclet>
            <docletPath>${project.build.outputDirectory}</docletPath>
            <destDir>SiteMap</destDir>

            <author>false</author>
            <useStandardDocletOptions>false</useStandardDocletOptions>
            <!-- there has got to be a better way to do this! -->
            <!-- how can I fix the CSSD-Web - Base to use a proper manifest file? -->
            <bootclasspath>
              ${bootClassPath};
              ${env.CLASSPATH};
              ${m2Repository}/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar;
              ${m2Repository}/org/apache/wicket/wicket-core/${wicket.version}/wicket-core-${wicket.version}.jar;
              ${m2Repository}/us/ak/state/revenue/cssd/CSSD-Web/${CSSDWebBase.version}/CSSD-Web-${CSSDWebBase.version}.jar
            </bootclasspath>
            <additionalDependencies>
              <additionalDependency>
                <groupId>us.ak.state.revenue.cssd</groupId>
                <artifactId>CSSD-Web</artifactId>
                <version>${CSSDWebBase.version}</version>
              </additionalDependency>
              <additionalDependency>
                <groupId>org.apache.wicket</groupId>
                <artifactId>wicket-core</artifactId>
                <version>${wicket.version}</version>
              </additionalDependency>
              <additionalDependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.16</version>
              </additionalDependency>
              <additionalDependency>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
                <version>1.1.1</version>
              </additionalDependency>
            </additionalDependencies>

            <name>SiteMapDoclet</name>
            <description>Page Descriptions for SiteMap generation</description>
          </configuration>
          <reports>
            <report>javadoc</report>
          </reports>
        </reportSet>
      </reportSets>
    </plugin>
  </plugins>
</reporting>

НОТА:
${m2Repository} определяется как свойство выше файла,
определяется как ${env.USERPROFILE}/.m2/repository
${bootClassPath} определяется как свойство выше файла,
определяется как ${env.JRE_6_HOME}\lib\rt.jar;${env.JAVA_HOME}\lib\tools.jar;

Как я могу исправить NoClassDefFoundError?

Кроме того, я хотел бы, чтобы мой файл SiteMap запускался как часть обычного процесса сборки после compile но прежде package,

Я пытался определить это в build, но javadoc не создается, и я не вижу никакого вывода журнала из моего Doclet.

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>2.9</version>
    <executions>
      <execution>
        <id>build-siteMap-Descriptions</id>
        <phase>process-classes</phase>
      </execution>
    </executions>
  </plugin>

ОБНОВИТЬ:
Благодаря предложению @ben75. Я удалил <reporting> раздел моего pom.xml, и теперь во время сборки происходит сбой процесса. я добавил <goals> и скопировал <configuration> раздел из <reporting>,

Это все еще бросает NoClassDefFoundError но это происходит на сборке, где я хочу. Я попытался добавить:

<includeDependencySources>true</includeDependencySources>
<dependencySourceIncludes>
  <dependencySourceInclude>org.apache.wicket:wicket-core:*</dependencySourceInclude>
  <dependencySourceInclude>org.apache.commons.logging:*</dependencySourceInclude>
  <dependencySourceInclude>us.ak.state.revenue.cssd:CSSD-Web:*</dependencySourceInclude>
</dependencySourceIncludes>

В разделе конфигурации, но это не сработало.

2 ответа

Решение

Опираясь на @ben75s Отличный совет, я смог заставить его наконец-то работать.
Это работает". Это неправильно, и я хотел бы увидеть лучший метод.

Вот что я сделал:

  • Определен плагин в разделе сборки с целью javadoc.
    • убедитесь, что tools.jar и rt.jar находятся в <bootclasspath>
    • определили <docletPath> как \;.;${project.build.outputDirectory};
      • \;.; необходимы, потому что Maven не добавляется правильно
      • Также пришлось явно добавить путь к некоторым пакетам, чтобы предотвратить наследование конфликтующих версий. (В частности, Log4J)
    • определенный <docletArtifacts> с пакетами для классов, бросая NoClassDefFoundError

Мой плагин теперь выглядит так:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>2.9</version>
    <executions>
      <execution>
        <id>build-siteMap-Descriptions</id>
        <phase>process-classes</phase>
        <goals>
          <!--<goal>aggregate</goal>-->
          <goal>javadoc</goal>
        </goals>
        <configuration>
          <doclet>
            us.ak.state.revenue.cssd.Personnel.utils.SiteMapDoclet
          </doclet>
          <!-- the initial '\;.;' is required
               because maven doesn't separate the path statements properly

               The 5 packages are necessary
               because otherwise slf4j complains about multiple bindings
          -->
          <docletPath>
            \;.;${project.build.outputDirectory};
            ${m2Repository}/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar;
            ${m2Repository}/log4j/log4j/1.2.16/log4j-1.2.16.jar;
            ${m2Repository}/log4j/apache-log4j-extras/1.1/apache-log4j-extras-1.1.jar;
            ${m2Repository}/us/ak/state/revenue/cssd/CSSD-Web/${CSSDWebBase.version}/CSSD-Web-${CSSDWebBase.version}.jar;
            ${m2Repository}/org/apache/wicket/wicket-core/${wicket.version}/wicket-core-${wicket.version}.jar;
            ${m2Repository}/org/apache/wicket/wicket-util/${wicket.version}/wicket-util-${wicket.version}.jar;
          </docletPath>
          <docletArtifacts>
            <!--
            <docletArtifact>
              <groupId>commons-logging</groupId>
              <artifactId>commons-logging</artifactId>
              <version>1.1.1</version>
            </docletArtifact>
            -->
            <docletArtifact>
              <groupId>org.slf4j</groupId>
              <artifactId>slf4j-log4j12</artifactId>
              <version>1.6.2</version>
            </docletArtifact>
            <!-- how do I fix the download errors? -->
            <!--
            <docletArtifact>
              <groupId>org.slf4j</groupId>
              <artifactId>slf4j-api</artifactId>
              <version>1.6.2</version>
            </docletArtifact>
            -->
            <!--
            <artifact>
              <groupId>log4j</groupId>
              <artifactId>log4j</artifactId>
              <version>1.2.16</version>
            </artifact>
            -->
            <!--
            <docletArtifact>
              <groupId>log4j</groupId>
              <artifactId>apache-log4j-extras</artifactId>
              <version>1.1</version>
            </docletArtifact>
            <docletArtifact>
              <groupId>us.ak.state.revenue.cssd</groupId>
              <artifactId>CSSD-Web</artifactId>
              <version>${CSSDWebBase.version}</version>
            </docletArtifact>
            <docletArtifact>
              <groupId>org.apache.wicket</groupId>
              <artifactId>wicket-core</artifactId>
              <version>${wicket.version}</version>
            </docletArtifact>
            -->
          </docletArtifacts>

          <!-- the initial '\;.;' is required
               because maven doesn't separate the path statements properly -->
          <bootclasspath>
            \;.;
            ${bootClassPath};
            ${env.CLASSPATH};
          </bootclasspath>

          <destDir>SiteMap</destDir>

          <author>false</author>
          <!-- don't print the packages/classes it's running on -->
          <quiet>true</quiet>
          <debug>true</debug> <!-- save options -->
          <useStandardDocletOptions>false</useStandardDocletOptions>

          <name>SiteMapDoclet</name>
          <description>Page Descriptions for SiteMap generation</description>
        </configuration>
      </execution>
    </executions>
  </plugin>

Вы можете попробовать поставить свой <additionalDependencies> как зависимости плагина:

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-javadoc-plugin</artifactId>
      <version>2.9</version>
      <dependencies>
         <dependency>
            <groupId>us.ak.state.revenue.cssd</groupId>
            <artifactId>CSSD-Web</artifactId>
            <version>${CSSDWebBase.version}</version>
         </dependency>
         ...

Чтобы подключить плагин javadoc к вашему обычному процессу сборки, я думаю, что вам просто нужно указать цель и, желательно, присоединить ее к фазе подготовки-пакета (чтобы javadoc не генерировался, когда вы просто запускаете фазу тестирования):

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>2.9</version>
            <executions>
                <execution>
                    <id>attach-javadoc</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
Другие вопросы по тегам