Kotlin maven 插件编译顺序



我有一个关于 kotlin-maven 插件的问题:编译顺序是如何确定的?我的意思是:Kotlin 编译器必须排在第一位吗?它懂Java代码吗?java编译器不理解kotlin代码,所以我想它会检查字节码,但为此,kotlin的字节码必须存在,所以必须有人确定kotline编译器必须在javac之前编译其代码。

示例:我有依赖于 Kotlin B 类的 java 类,B 类也依赖于 A。

我是否必须在 maven 插件中手动执行某些操作,方法是在 java maven 编译器之前声明它?

Kotlin 编译器可以解析 Java 源代码,因此您可以在 Kotlin 代码中引用 Java 类,即使这些类尚未编译。

在 Kotlin 编译器编译了 kotlin 代码之后,Java 编译器可以编译那些将编译的 kotlin 类作为依赖项的 Java 类。

所以,回答你的问题,是的 — Kotlin 编译器插件必须在混合 Kotlin 和 java 源代码的项目中的 java 编译器插件之前执行。这是通过在构建的早期阶段(即 process-sources )调度执行来实现的。

以下是混合 Kotlin-Java maven 模块的 kotlin maven 插件配置示例:

<plugin>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-maven-plugin</artifactId>
    <version>${kotlin.version}</version>
    <executions>
        <execution>
            <id>compile</id>
            <phase>process-sources</phase>
            <goals>
                <goal>compile</goal>
            </goals>
        </execution>
        <execution>
            <id>test-compile</id>
            <phase>test-compile</phase>
            <goals>
                <goal>test-compile</goal>
            </goals>
        </execution>
    </executions>
</plugin>

为了编译同时包含 Kotlin 和 Java 代码的项目,您必须确保 Kotlin 编译器在 Java 编译器之前运行。我按照官方 Kotlin 文档中的描述配置了编译插件,它就像一个魅力:

        <plugin>
            <artifactId>kotlin-maven-plugin</artifactId>
            <groupId>org.jetbrains.kotlin</groupId>
            <version>${kotlin.version}</version>
            <executions>
                <execution>
                    <id>compile</id>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
                <execution>
                    <id>test-compile</id>
                    <goals>
                        <goal>test-compile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <groupId>org.apache.maven.plugins</groupId>
            <version>3.5.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
            <executions>
                <execution>
                    <id>default-compile</id>
                    <phase>none</phase>
                </execution>
                <execution>
                    <id>default-testCompile</id>
                    <phase>none</phase>
                </execution>
                <execution>
                    <id>java-compile</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
                <execution>
                    <id>java-test-compile</id>
                    <phase>test-compile</phase>
                    <goals>
                        <goal>testCompile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

最新更新