10

我已经使用 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 生成的代码?

4

2 回答 2

4

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

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

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

于 2018-10-30T21:44:34.413 回答
0

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

于 2020-05-29T15:09:25.463 回答