2013-02-20 21 views
1

我試圖在編譯時將所有類javadoc註釋(最好是庫WebPage類的子類)轉儲到格式爲classname=comment的.properties文件中。如何在我的項目中編譯和運行我的Custom Doclet類?

到目前爲止,我有:

  • 創建的doclet類SiteMapDoclet
    • 類定義掃描項目中的所有的javadoc和轉儲他們.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,即使它們是我的項目的正常依賴關係。 我也嘗試添加路徑到罐子,我期望我的類需要作爲bootclasspath的一部分。

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

UPDATE:
感謝@ ben75的建議。我刪除了我的pom.xml中的<reporting>部分,現在在構建過程中失敗。我添加了<goals>並複製了<reporting>中的<configuration>部分。

它仍然扔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> 

到配置部分,但沒有奏效。

回答

0

大廈我能得到它的最終運行。
這個「有效」。感覺不對,我很樂意看到更好的方法。

這裏就是我所做的:

  • 定義插件與javadoc的目標構建部分。
    • 確信的tools.jar和rt.jar中都在<bootclasspath>
    • 定義<docletPath>\;.;${project.build.outputDirectory};
      • \;.;是必要的,因爲行家不追加正確
      • 也必須明確添加路徑到這裏的一些軟件包來防止衝突版本的繼承。 (具體的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> 
1

你可以嘗試把你的<additionalDependencies>作爲插件dependendencies:

<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):在@ ben75s優秀諮詢

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

我仍然得到'NoNoClassDefFoundError',但現在我已經在'mvn package'上得到了它。:)我只需要將''從報告複製/粘貼到build。 – Raystorm 2013-02-20 22:02:28

相關問題