我正在为一个包含2,509个类的模块构建一个Javadoc。目前每秒需要7分钟或6个文件。
我试过了
mvn -T 1C install
但javadoc
仅使用1个CPU。有没有办法使用更多和/或加速?
我正在使用 Oracle JDK 8更新112 。我的开发机器有16个内核和128 GB内存。
运行飞行记录器我可以看到只有一个线程main
对于有兴趣的人,我使用了以下选项:
<plugin>
<artifactId>maven-javadoc-plugin</artifactId>
<configuration>
<additionalJOptions>
<additionalJOption>-J-XX:+UnlockCommercialFeatures</additionalJOption>
<additionalJOption>-J-XX:+FlightRecorder</additionalJOption>
<additionalJOption>-J-XX:StartFlightRecording=name=test,filename=/tmp/myrecording-50.jfr,dumponexit=true</additionalJOption>
<additionalJOption>-J-XX:FlightRecorderOptions=loglevel=debug</additionalJOption>
</additionalJOptions>
</configuration>
</plugin>
注意:一种解决方法是:
-Dmaven.javadoc.skip=true
答案 0 :(得分:6)
使用-T1C运行maven将导致maven尝试并行构建模块,因此如果您有一个多模块项目,最多它将并行构建每个模块的javadoc(如果模块之间的依赖关系图允许它)。
javadoc进程本身是单线程的,因此您将无法使用多个内核来生成单个模块的javadoc。
但是,由于你有很多类(可能还有很多@link doclet或类似的?),也许javadoc进程可以从扩展堆中受益。你有没有看过GC活动? 尝试在您的配置中添加此功能,看看是否有帮助:
<additionalJOption>-J-Xms2g</additionalJOption>
<additionalJOption>-J-Xmx2g</additionalJOption>
答案 1 :(得分:4)
@lbndev是正确的,至少使用Javadoc随附的默认Doclet(com.sun.tools.doclets.formats.html.HtmlDoclet
)。浏览源代码可以确认单线程实现:
new ClassTree()
,后者调用ClassTree.buildTree(),后者使用for
循环来迭代类列表,从而生成类模型for
循环package.allClasses()
循环中迭代for
。(这些链接均指向JDK 8源。使用JDK 11时,类已移动,但是for
和HtmlDoclet
中的基本AbstractDoclet
循环仍然存在。)
这不是您希望听到的,但是在当前标准Javadoc中,至少在单个Maven模块中,这似乎没有多线程选择。
generateClassFiles()
等很适合进行多线程处理,尽管这可能需要对JDK进行更改。如下所述,AbstractDoclet.isValidDoclet()甚至主动阻止HtmlDoclet
的子类化。试图作为第三方重新实现其中一些循环,将需要引入许多其他代码。
对其他Doclet实现(例如javadown)进行的扫描仅在包和类的向下钻取中发现了类似的实现样式。该线程上的其他人可能会知道更多。
更广泛地考虑,可能有调整DocFileFactory的空间。显然已将其标记为内部类(在程序包中甚至不是公共类),但它确实抽象了(HTML)文件的编写。可能的替代版本可能会将HTML缓冲在内存中,或直接流到zip文件中,以提高IO性能。但是显然,这还需要了解JDK工具发生变更的风险。
答案 2 :(得分:0)
javadoc和标准doclet当前基本上是单线程的。
主要通过并行生成页面来改善此问题是“迫在眉睫”,但这意味着将MT安全性改造为各种共享数据结构。
答案 3 :(得分:0)
您可以让Maven在所有内核中每个内核使用多个线程。
例如。
mvn -T 4C install # will use 4 threads per available CPU core
您可以将上方的4
更改为所需的任何数字。您有一台拥有大量资源的机器。尝试使用8
或16
。
您还尝试过使用javadoc-no-fork
吗?这样可以确保不会再次触发javadoc-https://maven.apache.org/plugins/maven-javadoc-plugin/examples/javadoc-nofork.html
答案 4 :(得分:0)
Maven定制是一种加快Javadoc生成速度的方法。
另一种方法是更改用于生成javadoc的doclet。 Maven Javadoc插件允许您更改用于生成Javadoc的doclet
https://maven.apache.org/plugins/maven-javadoc-plugin/examples/alternate-doclet.html
我确实发现了以下商业doclet(我没有任何形式的隶属关系),但声称比传统的Javadoc更快。它提供了免费/试用/商业许可证。如果您真的很想加快Javadoc的构建速度,也许值得看看它是否物有所值
http://www.filigris.com/docflex-javadoc
也许互联网上存在开源替代方案...
答案 5 :(得分:-3)
使用doxygen而不是常规的mvn,你现在正在使用它。