我正在尝试为多模块项目创建聚合javadoc。该项目使用mvn install -DskipTests
编译(我没有在我的机器上运行测试)。当我运行mvn validate javadoc:javadoc
时,它可以工作并编译每个modules \ target \ apidocs目录中的所有javadoc。然后,当我运行时mvn validate javadoc:javadoc javadoc:aggregate
或mvn 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都以同样的方式失败。
答案 0 :(得分:2)
修正: javadoc编译器中有一个bug 1.6和1.7,其中没有jar的注释会抛出NPE。 1.8 javadoc编译器工作但我仍然得到错误,因为我没有正确的jar。我不得不浏览几个不同的poms,因为我的一个模块有一个不同的hibernate库硬编码到它。
最终结果: 当我将该库更改为标准库时,maven无法编译,但javadoc:aggregate运行得很好。切换到我的模块中的版本也不起作用。我最终不得不使用this解决方法从我的javadoc构建中删除该模块。这并不重要,因为它是一个实验模块,但如果我需要它,我会简单地添加一个配置文件,允许我在javadoc运行时更改版本。
希望没有人像我一样再次陷入困境。 :)