Kotlin maven插件编译顺序

时间:2016-06-06 08:38:29

标签: maven kotlin

我对kotlin-maven插件有疑问: 如何确定编译顺序? 我的意思是:kotlin编译器必须先来吗?它能理解java代码吗? java编译器不了解kotlin代码,所以我猜它会检查字节代码,但为此,必须存在kotlin的字节码,因此有人必须确定kotline编译器必须在javac之前编译其代码。

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

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

2 个答案:

答案 0 :(得分:11)

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>

答案 1 :(得分:2)

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

        <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>