【问题标题】:How to access `JavaToolchainSpec` from within custom Gradle task如何从自定义 Gradle 任务中访问“JavaToolchainSpec”
【发布时间】:2021-08-31 04:21:10
【问题描述】:

根据“Toolchains for plugin authors”,应该可以从自定义任务中访问配置的JavaToolchainSpec。我尝试在自定义插件中使用这种方法,该插件根据JavaPlugin 的存在创建任务并查询配置的languageVersion 属性。这是一个最小的例子。

build.gradle

plugins {
  id 'application'
  id 'com.example.myplugin'
}

...

java {
    toolchain {
        languageVersion.set(JavaLanguageVersion.of(17))
    }
}

MyPlugin.kt

class MyPlugin : Plugin<Project> {

  override fun apply(target: Project) {
    target.plugins.withType<JavaPlugin> {
      target.tasks.create<MyTask>("mytask")
    }
  }
}

MyTask.kt

abstract class MyTask : DefaultTask() {
  
  init {
    val extension = project.extensions.getByType<JavaPluginExtension>();
    val languageVersion = extension.toolchain.languageVersion.get();

    ...
  }
}

一旦 Gradle 创建 MyTask 并查询 languageVersion 属性,构建将失败并出现以下错误。

Cannot query the value of property 'languageVersion' because it has no value available.

我的猜测是我访问扩展程序太早了,并且此时它还没有设置它的值。我现在的问题是,是否有办法将配置的属性(最好使用惰性机制)与任务联系起来。

【问题讨论】:

    标签: kotlin gradle plugins configuration toolchain


    【解决方案1】:

    显然你必须在java插件扩展中配置工具链对象才能使用JavaToolchainService,使用类似的东西:

    java {
        toolchain {
            languageVersion = JavaLanguageVersion.of(11)
       }
    }
    

    如果您不这样做,Gradle 将默认使用当前 JVM,并且整个工具链 API 将不可用(留下您报告的错误)

    【讨论】:

      猜你喜欢
      • 2019-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 2015-06-14
      相关资源
      最近更新 更多