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 生成的代码在编译阶段不可用的主要内容,如果未能解决你的问题,请参考以下文章
pod 更新后编译时出现错误“'sharedApplication' 不可用:在 iOS (App Extension) 上不可用....”
java泛型的作用是在编译阶段防止错误输入,绕过编译就绕过泛型,可用反射验证
Expo SDK 需要 Expo 才能运行。似乎本机 Expo 模块不可用,并且此代码未在 Expo 上运行。我想生成apk