【问题标题】:Kotlin maven plugin order of compilationKotlin maven 插件编译顺序
【发布时间】:2016-06-06 08:38:29
【问题描述】:

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

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

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

【问题讨论】:

    标签: maven kotlin


    【解决方案1】:

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

    在 Kotlin 编译器编译好 kotlin 代码后,Java 编译器可以将编译好的 kotlin 类作为依赖来编译这些 java 类。

    所以,回答你的问题,是的——在混合了 kotlin 和 java 源的项目中,必须在 java 编译器插件之前执行 Kotlin 编译器插件。这是通过在构建的早期阶段(即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>
    

    【讨论】:

    • 虽然请注意您有一个混合的 java/kotlin 测试代码库,但您可能希望 process-test-sources 作为您的测试编译阶段
    • @llya,你解释的有道理,实际上对我有用,但让我困惑的是阅读Compile Kotlin & Java sources,提到只需在 maven 编译器之前添加 Kotlin 插件,就可以编译一个混合项目。我试过了,但没有用。我必须将 Kotlin 绑定到 process-sources 阶段才能使其工作。您知道实际文档建议背后的原因吗?
    【解决方案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>
    

    【讨论】:

    • 官方文档对我不起作用,因为这个文档上的“阶段”说“编译”,但实际上它应该在“进程源”上运行。
    猜你喜欢
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多