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

时间:2018-10-15 15:01:49

标签: maven kotlin kapt

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

我发现kapt生成器在Kotlin的编译阶段之后被调用,这使我无法在同一项目中的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生成的代码?

2 个答案:

答案 0 :(得分:4)

问题是from flask import Flask, render_template app = Flask(__name__) # or e.g. Flask(__name__, template_folder='../otherdir') @app.route("/") def home(): return "Hello world" @app.route("/hello/again") def hello_again(): return render_template("hello_again.html") if __name__ == "__main__": app.run() 是在没有kapt目标的父pom中定义的,然后又是在与kapt相同的模块自身pom中定义的。

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

删除父pom条目即可解决此问题。

答案 1 :(得分:0)

您可以使用gradle DAG来简单地通过使编译/汇编任务依赖于kapt任务来解决问题。如果您有帮助,我知道如何在android中执行此操作,请告诉我,我将在之后发布代码。