Pet*_*rey 44 java javadoc maven-javadoc-plugin
我正在为一个包含2,509个类的模块构建一个Javadoc.这目前每秒需要7分钟或6个文件.
我试过了
mvn -T 1C install
Run Code Online (Sandbox Code Playgroud)
但是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>
Run Code Online (Sandbox Code Playgroud)
注意:一种解决方法是:
-Dmaven.javadoc.skip=true
Run Code Online (Sandbox Code Playgroud)
使用-T1C运行maven将导致maven尝试并行构建模块,因此如果您有一个多模块项目,最好它将并行构建每个模块的javadoc(如果模块之间的依赖关系图允许它).
javadoc进程本身是单线程的,因此您将无法使用多个内核来生成单个模块的javadoc.
但是,既然你有很多类(可能还有很多@link doclet或者类似的?),那么javadoc进程可能会从扩展堆中受益.你有没有看过GC活动?尝试在您的配置中添加它,看看它是否有帮助:
<additionalJOption>-J-Xms2g</additionalJOption>
<additionalJOption>-J-Xmx2g</additionalJOption>
Run Code Online (Sandbox Code Playgroud)
@lbndev 是对的,至少com.sun.tools.doclets.formats.html.HtmlDoclet对于 Javadoc 提供的默认 Doclet ( )。查看源代码确认了单线程实现:
new ClassTree()which 调用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 工具更改的风险。
| 归档时间: |
|
| 查看次数: |
1331 次 |
| 最近记录: |