如何获取 kotlin 代码中 'gradle.properties 中定义的自定义属性?

dli*_*120 6 properties gradle kotlin gradle-kotlin-dsl

我在以下位置添加了一个自定义属性gradle.properties

libraryVersion=0.1.0-beta
Run Code Online (Sandbox Code Playgroud)

如何在我发布的代码中阅读此内容?我想在我的 Kotlin 库中使用这个值,而不需要对其进行硬编码。

yun*_*nir 6

您可以访问 中定义的系统属性gradle.properties。他们应该有systemProp.前缀。然后在 gradle 构建文件中,您应该将其传递到程序内部。

这是打印 中定义的属性的控制台应用程序的示例gradle.properties

文件gradle.properties

systemProp.libraryVersion=0.1.0-beta
Run Code Online (Sandbox Code Playgroud)

文件Main.kt

systemProp.libraryVersion=0.1.0-beta
Run Code Online (Sandbox Code Playgroud)

文件build.gradle.kts

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    kotlin("jvm") version "1.5.10"
    application
}

group = "me.yunir"
version = "0.1"

repositories {
    mavenCentral()
}

dependencies {
    testImplementation(kotlin("test"))
}

tasks.test {
    useJUnitPlatform()
}

tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "11"
}

application {
    mainClass.set("MainKt")
//    applicationDefaultJvmArgs = listOf(                              // 1
//        "-DlibraryVersion=${System.getProperty("libraryVersion")}"
//    )
}

tasks.named<JavaExec>("run") {                                         // 2
    systemProperty("libraryVersion", System.getProperty("libraryVersion"))
}
Run Code Online (Sandbox Code Playgroud)

将系统属性传递给程序有两种变体:

  • 使用“应用程序”插件特定的属性applicationDefaultJvmArgs
  • systemProperty针对特定任务使用方法

程序的输出:

0.1.0-beta
Run Code Online (Sandbox Code Playgroud)

附加链接:

UPD。1

或者,如果您不想使用前缀systemProp.并使用 gradle 项目属性,那么第二个变体将如下所示:

文件gradle.properties

libraryVersion=0.1.0-beta
Run Code Online (Sandbox Code Playgroud)

文件build.gradle.kts

...
tasks.named<JavaExec>("run") {                                         // 2
    systemProperty("libraryVersion", findProperty("libraryVersion") ?: "")
}
...
Run Code Online (Sandbox Code Playgroud)


dli*_*120 0

经过一段时间的挖掘,我找到了我正在寻找的答案

这是解决方案:

构建.gradle.kts:

import java.io.FileOutputStream
import java.util.Properties

version = "1.0.0"

val generatedVersionDir = "$buildDir/generated-version"

sourceSets {
  main {
    kotlin {
      output.dir(generatedVersionDir)
    }
  }
}

tasks.register("generateVersionProperties") {
  doLast {
    val propertiesFile = file("$generatedVersionDir/version.properties")
    propertiesFile.parentFile.mkdirs()
    val properties = Properties()
    properties.setProperty("version", "$version")
    val out = FileOutputStream(propertiesFile)
    properties.store(out, null)
  }
}

tasks.named("processResources") {
  dependsOn("generateVersionProperties")
}
Run Code Online (Sandbox Code Playgroud)

库.kts:

private val versionProperties = Properties()

val version: String
  get() {
    return versionProperties.getProperty("version") ?: "unknown"
  }

init {
  val versionPropertiesFile = this.javaClass.getResourceAsStream("/version.properties")
  versionProperties.load(versionPropertiesFile)
}
Run Code Online (Sandbox Code Playgroud)