Kotlin项目Maven编译耗时超30秒,如何优化kapt与编译速度?
针对你遇到的kapt和Kotlin编译器各耗时15秒的问题,可从以下两方面针对性优化:
一、kapt注解处理环节优化
- 启用增量注解处理:在
kotlin-maven-plugin的kapt配置中添加参数,让注解处理器仅处理变更的文件:<plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <version>${kotlin.version}</version> <executions> <execution> <id>kapt</id> <goals> <goal>kapt</goal> </goals> <configuration> <arguments> <argument>-Xkapt.incremental=true</argument> <argument>-Xkapt.use.worker.api=true</argument> </arguments> </configuration> </execution> </executions> </plugin> - 清理冗余注解处理器:检查项目依赖,将仅用于测试的注解处理器移至
testscope,移除未使用的注解处理器依赖,减少kapt的处理负载。 - 开启kapt构建缓存:在kapt配置中启用构建缓存,避免重复处理相同代码:
<configuration> <useBuildCache>true</useBuildCache> </configuration> - 优化自定义注解处理器:如果项目包含自定义注解处理器,优化其内部逻辑——减少反射使用、缓存计算结果、避免不必要的IO操作,降低单处理器耗时。
二、Kotlin编译器环节优化
- 启用增量编译:在
kotlin-maven-plugin中开启增量编译,仅编译修改过的文件:<plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <version>${kotlin.version}</version> <configuration> <incremental>true</incremental> </configuration> </plugin> - 分配充足的JVM资源:调整Maven或Kotlin编译器的JVM参数,避免内存不足导致频繁GC:
设置环境变量:
或在插件中直接配置:export MAVEN_OPTS="-Xmx2g -XX:+UseParallelGC"<configuration> <jvmArgs>-Xmx2g -XX:+UseParallelGC</jvmArgs> </configuration> - 升级插件版本:使用最新稳定版的
kotlin-maven-plugin和Kotlin语言版本,新版本通常包含性能优化和Bug修复。 - 并行构建与模块拆分:
- 执行Maven编译时启用并行模式:
mvn compile -T 1C(1C表示每个CPU核心分配一个线程) - 若项目规模较大,拆分为多个独立子模块,让Maven并行编译不同模块,降低单个模块的编译压力。
- 执行Maven编译时启用并行模式:
- 关闭非必要编译器检查:极端情况下,可关闭一些非关键的编译器检查(谨慎使用,避免引入代码问题):
<arguments> <argument>-Xno-param-assertions</argument> <argument>-Xskip-metadata-version-check</argument> </arguments>
调试信息
[DEBUG] Loading modules: [java.se, jdk.accessibility, jdk.attach, jdk.compiler, jdk.dynalink, jdk.httpserver, jdk.incubator.foreign, jdk.incubator.vector, jdk.jartool, jdk.javadoc, jdk.jconsole, jdk.jdi, jdk.jfr, jdk.jshell, jdk.jsobject, jdk.management, jdk.management.jfr, jdk.net, jdk.nio.mapmode, jdk.sctp, jdk.security.auth, jdk.security.jgss, jdk.unsupported, jdk.unsupported.desktop, jdk.xml.dom, java.base, java.compiler, java.datatransfer, java.desktop, java.xml, java.instrument, java.logging, java.management, java.management.rmi, java.rmi, java.naming, java.net.http, java.prefs, java.scripting, java.security.jgss, java.security.sasl, java.sql, java.transaction.xa, java.sql.rowset, java.xml.crypto, jdk.internal.jvmstat, jdk.management.agent, jdk.jdwp.agent, jdk.internal.ed, jdk.internal.le, jdk.internal.opt]
内容的提问来源于stack exchange,提问作者Prog

