Maven javadoc:javadoc工作但是javadoc:aggregate会抛出看起来像编译器错误的错误

时间:2014-07-03 23:10:28

标签: java spring maven javadoc

我正在尝试为多模块项目创建聚合javadoc。该项目使用mvn install -DskipTests编译(我没有在我的机器上运行测试)。当我运行mvn validate javadoc:javadoc时,它可以工作并编译每个modules \ target \ apidocs目录中的所有javadoc。然后,当我运行时mvn validate javadoc:javadoc javadoc:aggregatemvn validate javadoc:aggregate中途失败,大约有1200行错误。一些类型的例子是:

Failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:2.9.1:aggregate (default-cli) on project commons-superpom: An error has occurred in JavaDocs report generation:
[ERROR] Exit code: 1 - C:\workspaces\win\tfs\****\Foo.java:21: type org.springframework.context.ApplicationListener does not take parameters
[ERROR] public class Foo implements ApplicationContextAware, ApplicationListener<ContextRefreshedEvent> {
[ERROR] ^
.
.
.
C:\workspaces\win\tfs\****\test\Bar.java:52: cannot find symbol
[ERROR] symbol  : class PostInsertEvent
[ERROR] location: class com.Barclass
[ERROR] public void BarFunct(PostInsertEvent event) {
[ERROR] ^
[ERROR] C:java.lang.NullPointerException
[ERROR] at com.sun.tools.javadoc.TypeMaker.getType(TypeMaker.java:67)
[ERROR] at com.sun.tools.javadoc.TypeMaker.getType(TypeMaker.java:29)
[ERROR] at com.sun.tools.javadoc.ClassDocImpl.superclassType(ClassDocImpl.java:439)
[ERROR] at com.sun.tools.doclets.internal.toolkit.util.Util.getAllInterfaces(Util.java:386)
[ERROR] at com.sun.tools.doclets.internal.toolkit.util.Util.getAllInterfaces(Util.java:424)
[ERROR] at com.sun.tools.doclets.internal.toolkit.util.ClassTree.processType(ClassTree.java:162)
[ERROR] at com.sun.tools.doclets.internal.toolkit.util.ClassTree.buildTree(ClassTree.java:114)
[ERROR] at com.sun.tools.doclets.internal.toolkit.util.ClassTree.<init>(ClassTree.java:73)
[ERROR] at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.startGeneration(AbstractDoclet.java:104)
[ERROR] at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.start(AbstractDoclet.java:64)
[ERROR] at com.sun.tools.doclets.formats.html.HtmlDoclet.start(HtmlDoclet.java:42)
[ERROR] at com.sun.tools.doclets.standard.Standard.start(Standard.java:23)
[ERROR] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[ERROR] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[ERROR] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[ERROR] at java.lang.reflect.Method.invoke(Method.java:597)
[ERROR] at com.sun.tools.javadoc.DocletInvoker.invoke(DocletInvoker.java:269)
[ERROR] at com.sun.tools.javadoc.DocletInvoker.start(DocletInvoker.java:143)
[ERROR] at com.sun.tools.javadoc.Start.parseAndExecute(Start.java:340)
[ERROR] at com.sun.tools.javadoc.Start.begin(Start.java:128)
[ERROR] at com.sun.tools.javadoc.Main.execute(Main.java:41)
[ERROR] at com.sun.tools.javadoc.Main.main(Main.java:31)

崩溃后,我父pom.xml旁边的/ target目录中的所有内容都崩溃了2个文件1是javadoc-bundle-options,其中包含一个xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<javadocOptions>
  <docletArtifacts>
    <docletArtifact />
  </docletArtifacts>
  <tagletArtifacts>
    <tagletArtifact />
  </tagletArtifacts>
  <excludePackageNames>
    <excludePackageName>org.foobar.*</excludePackageName>
  </excludePackageNames>
  <javadocResourcesDirectory>src/main/javadoc</javadocResourcesDirectory>
</javadocOptions>

,第二个是包含名为apidocs的文件的站点,该文件包含3个文件javadoc.bat,options和packages。它们包含它们看起来包含批处理脚本的内容,以便在这些包上运行带有这些选项的javadoc.exe。

我复制的第一个错误是错误的。 ApplicationListener是参数化的,可以根据spring文档获取ContextRefreshedEvent。在第二个错误中也正确导入了PostInsertEvent。我不知道NullPointerException发生在哪里。

我的javadoc:aggregate的插件配置如下:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>${maven-javadoc-plugin.version}</version>
    <executions>
            <execution>
                    <id>attach-javadocs</id>
                    <goals>
                            <goal>aggregate</goal>
                    </goals>
            </execution>
    </executions>
    <configuration>
            <excludePackageNames>org.hibernate.*;org.spring.*<-!-- ;com.***.hibernate.audit --></excludePackageNames>
            <verbose>true</verbose>
            <fork>true</fork>
            <showDeprecation>true</showDeprecation>
            <showWarnings>true</showWarnings>
            <source>${java.source.version}</source>
            <target>${java.target.version}</target>
            <compilerVersion>${java.source.version}</compilerVersion>
            <compilerArgument>-Xlint:all</compilerArgument>
            <minmemory>128m</minmemory>
            <maxmem>512m</maxmem>

            <encoding>${project.build.sourceEncoding}</encoding>

            <additionalparam>
                    -charset UTF-8 
                    -docencoding UTF-8 
                    -version 
                    -author 
                    -breakiterator 
                    -linksource 
                    -sourcetab 4 
                    -windowtitle "${project.name} ${project.version} API Reference" 
                    -doctitle "${project.name} ${project.version} API Reference" 
                    -bottom "Copyright ${project.inceptionYear}-Present ${project.organization.name}. All Rights Reserved." 
                    -link http://java.sun.com/javase/6/docs/api/
                    -link http://jsr311.java.net/nonav/releases/1.1
            </additionalparam>
    </configuration>
 </plugin>

如果我排除了评论包,那么构建运行正常。但是,如果我排除了包中的所有文件而不是包,那么它会因非常相似的错误而崩溃。我可以在eclipse中生成javadoc。如果我编辑在使用3.3.2.GA/hibernate-core-3.3.2.GA.jar而不是hibernate-core-4.1.8.Final.jar后生成的选项文件然后运行,我可以停止nullpointerexception蝙蝠文件。这会生成一个完整的聚合javadoc站点,但是在运行中有几个与@Typedef相关的错误。 Javadoc 1.7_60和1.6_45都以同样的方式失败。

1 个答案:

答案 0 :(得分:2)

修正: javadoc编译器中有一个bug 1.6和1.7,其中没有jar的注释会抛出NPE。 1.8 javadoc编译器工作但我仍然得到错误,因为我没有正确的jar。我不得不浏览几个不同的poms,因为我的一个模块有一个不同的hibernate库硬编码到它。

最终结果: 当我将该库更改为标准库时,maven无法编译,但javadoc:aggregate运行得很好。切换到我的模块中的版本也不起作用。我最终不得不使用this解决方法从我的javadoc构建中删除该模块。这并不重要,因为它是一个实验模块,但如果我需要它,我会简单地添加一个配置文件,允许我在javadoc运行时更改版本。

希望没有人像我一样再次陷入困境。 :)