【问题标题】:How to achieve ordering of Java and Kotlin compilation tasks in single module Gradle project如何在单模块 Gradle 项目中实现 Java 和 Kotlin 编译任务的排序
【发布时间】:2021-09-24 09:36:05
【问题描述】:

我有一个用 Java 编写的后端服务,它使用 Spring Boot 作为框架,并借助 Lombok 作为注释处理器(用于生成样板代码),我使用 Gradle 构建。 我想以渐进且相当保守的方式将 Kotlin 引入该服务。也就是说,我想重写控制器,当机会出现时,那些控制器使用的代码等等向下调用堆栈,直到整个服务被重写。另外,我想保持严格的依赖规则:我的 Java 代码绝不会调用 Kotlin 代码。

关于 Gradle,我希望我的 Java 代码首先由 Java 编译器编译。我不希望 Kotlin 编译器接触这段代码,而只是依赖编译的类。我尝试为 Gradle 使用 Kotlin 插件(org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.21),但它以这样一种方式影响了我的构建,即任务 compileKotlin 首先出现

    Found task graph: org.gradle.execution.taskgraph.DefaultTaskExecutionGraph@782f578b
Found 29 tasks.
task ':compileKotlin'
task ':compileJava'

我希望它更像

task ':compileJava'
task ':compileKotlin'

我是否可以建立编译任务的顺序,以便在单模块 Gradle 项目中首先编译 Java?制作两个独立的模块是唯一的选择吗?

【问题讨论】:

    标签: java kotlin gradle


    【解决方案1】:

    不,不可能首先在单个模块中编译 Java。您可以尝试this SO answer 显示项目的依赖关系树。任务compileJava 确实依赖于compileKotlin

    :app:build
    +--- :app:assemble
    |    +--- :app:distTar
    |    |    +--- :app:jar
    |    |    |    +--- :app:classes
    |    |    |    |    +--- :app:compileJava
    |    |    |    |    |    \--- :app:compileKotlin
    |    |    |    |    \--- :app:processResources
    |    |    |    +--- :app:compileKotlin *
    |    |    |    \--- :app:inspectClassesForKotlinIC
    |    |    |         +--- :app:classes *
    |    |    |         \--- :app:compileKotlin *
    |    |    \--- :app:startScripts
    |    |         \--- :app:jar *
    |    +--- :app:distZip
    |    |    +--- :app:jar *
    |    |    \--- :app:startScripts *
    |    \--- :app:jar *
    \--- :app:check
         \--- :app:test
              +--- :app:classes *
              +--- :app:compileKotlin *
              +--- :app:compileTestKotlin
              |    +--- :app:classes *
              |    +--- :app:compileKotlin *
              |    \--- :app:jar *
              \--- :app:testClasses
                   +--- :app:compileTestJava
                   |    +--- :app:classes *
                   |    +--- :app:compileKotlin *
                   |    \--- :app:compileTestKotlin *
                   \--- :app:processTestResources
    

    此外,混合使用 Java 和 Kotlin 代码会使 Lombok 注释变得无用。您可以尝试从 Kotlin 代码访问 Lombok 注释的 POJO。

    我之前遇到过同样的问题,我不得不选择多模块解决方案。但是,这并不是一个糟糕的决定,因为build.gradle.ktss 更干净。

    【讨论】:

    • 谢谢。与此同时,我试图侵入 Jetbrains 插件来创建我自己的任务并在其中调用 Kotlin 编译器。没有太大的成功。不能说这是不可能的,但它正在破解工具。
    猜你喜欢
    • 1970-01-01
    • 2019-08-07
    • 2019-11-24
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多