kapt 生成的代码在编译阶段不可用

Posted

技术标签:

【中文标题】kapt 生成的代码在编译阶段不可用【英文标题】:kapt generated code not available during compilation phase 【发布时间】:2019-03-20 01:13:18 【问题描述】:

我已经使用 kapt 编写了一个代码生成器,并在使用 maven 编译 kotlin 的项目中使用它。

我发现在 Kotlin 的编译阶段之后调用了 kapt 生成器,这使我无法在同一项目中使用 kotlin 中生成的代码。

但是,如果我在同一个项目中从 Java 中引用生成的类,它就可以正常工作。这是因为 java 编译阶段在 kotlin 的生成阶段之后。

我已经在 maven 配置中 Kotlin 的编译目标之前指定了 kapt 目标(如 docs 中所述),但它似乎没有什么区别:

        <plugin>
            <artifactId>kotlin-maven-plugin</artifactId>
            <groupId>org.jetbrains.kotlin</groupId>
            <version>$kotlin.version</version>
            <executions>
                <execution>
                    <id>kapt</id>
                    <goals>
                        <goal>kapt</goal>
                    </goals>
                    <configuration>
                        <sourceDirs>
                            <sourceDir>src/main/java</sourceDir>
                        </sourceDirs>
                        <annotationProcessorPaths>
                            <annotationProcessorPath>
                                <groupId>lang.taxi</groupId>
                                <artifactId>taxi-annotation-processor</artifactId>
                                <version>$taxi.version</version>
                            </annotationProcessorPath>
                        </annotationProcessorPaths>
                    </configuration>
                </execution>
                <execution>
                    <id>compile</id>
                    <goals> <goal>compile</goal> </goals>
                </execution>
                <execution>
                    <id>test-compile</id>
                    <goals> <goal>test-compile</goal> </goals>
                    <configuration>
                        <sourceDirs>
                            <sourceDir>$project.basedir/src/test/kotlin</sourceDir>
                            <sourceDir>$project.basedir/src/test/java</sourceDir>
                        </sourceDirs>
                    </configuration>
                </execution>
            </executions>
        </plugin>

是否可以配置 Kotlin 以允许我在同一个项目中使用从 Kotlin 生成的代码?

【问题讨论】:

您使用的是 maven > 3.2 吗? (issues.apache.org/jira/browse/MNG-5799) @guido :是的,maven 3.5.0 【参考方案1】:

问题在于kotlin-maven-plugin 是在父 pom 中定义的,没有 kapt 目标,然后又在模块自己的 pom 中定义了 kapt。

这导致编译任务在 kapt 任务之前运行,即使模块的 pom 在 compile 之前指定了 kapt 的顺序。

删除父 pom 条目解决了该问题。

【讨论】:

【参考方案2】:

您可以使用 gradle DAG 来解决您的问题,只需让 compile/assemble 任务依赖于 kapt 任务。如果对您有帮助,我知道如何在 android 中执行此操作,请告诉我,我会立即发布代码。

【讨论】:

以上是关于kapt 生成的代码在编译阶段不可用的主要内容,如果未能解决你的问题,请参考以下文章

告别KAPT,使用KSP为Android编译提速

Xcode 4.6.1 调试器局部变量不可用

kapt 不解析 protobuf 生成的类

pod 更新后编译时出现错误“'sharedApplication' 不可用:在 iOS (App Extension) 上不可用....”

java泛型的作用是在编译阶段防止错误输入,绕过编译就绕过泛型,可用反射验证

Expo SDK 需要 Expo 才能运行。似乎本机 Expo 模块不可用,并且此代码未在 Expo 上运行。我想生成apk