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

10

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

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

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

我已在maven配置中将kapt目标指定在Kotlin编译目标之前(如文档中提到的),但似乎没有任何区别:

        <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 或更高版本?(https://issues.apache.org/jira/browse/MNG-5799) - guido
@guido:没错,Maven 3.5.0。 - Marty Pitt
2个回答

4
问题在于kotlin-maven-plugin在父POM中定义,没有kapt目标,并且在模块自己的POM中再次定义,带有kapt。

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

删除父POM条目解决了问题。


0

您可以使用Gradle DAG来解决问题,只需使编译/组装任务依赖于kapt任务即可。如果您需要帮助,我知道如何在Android中实现此操作,请告诉我,我会立即发布代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接