Импорт внешнего класса в Kotlin Скрипт Gradle не найден - PullRequest
0 голосов
/ 29 февраля 2020

В моем build.gradle.kts я хочу написать функцию, которая использует внешний класс: StrSubstitutor из Apach Commons Text. Однако импорт не найден, хотя я вижу библиотеку при запуске ./gradlew dependencies.

Файл build.gradle.kts выглядит следующим образом:

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

import org.apache.commons.text.StringSubstitutor // Import not found

plugins {
    val kotlinVersion = "1.3.61"
    kotlin("jvm") version "$kotlinVersion"
    kotlin("kapt") version "$kotlinVersion"
}

group = "com.example"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_11

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.apache.commons:commons-text:1.8")

    // SourceSets
    sourceSets.main {
        withConvention(KotlinSourceSet::class) {
            kotlin.srcDirs("src/main/kotlin")
        }
    }
    sourceSets.test {
        withConvention(KotlinSourceSet::class) {
            kotlin.srcDirs("src/main/kotlin")
        }
    }

}

tasks.withType<Test> {
    useJUnitPlatform()
    testLogging {
        events("passed", "skipped", "failed")
    }
    systemProperty("spring.profiles.active", "test")
}

tasks.withType<KotlinCompile> {
    kotlinOptions {
        freeCompilerArgs = listOf("-Xjsr305=strict")
        jvmTarget = "11"
    }
}

// Function that uses the import
fun getProperty(properties: Properties, propertyKey: String): String {
    // Use the import "StrSubstitutor"
    return ""
}

Возможно ли это с помощью Kotlin, и если да, то как?

1 Ответ

1 голос
/ 29 февраля 2020

Да, это возможно. Причина, по которой он работает не так, как написано, заключается в том, что вы помещаете зависимость от Apache Commons Text в implementation конфигурацию проекта , а не в classpath сценария сборки сама. Итак, вам нужно добавить блок buildscript в файл build.gradle.kts. Ниже приведен пример 1 :

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

import org.apache.commons.text.StringSubstitutor

// TL DR: Add this block to your build script to make the import above work
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.apache.commons:commons-text:1.8")
    }
}

tasks.register("hello") {
    doLast {
        println(StringSubstitutor.replaceSystemProperties(
            "You are running with Java \${java.version} on OS \${os.name}."))
    }
}

plugins {
    val kotlinVersion = "1.3.61"
    kotlin("jvm") version "$kotlinVersion"
    kotlin("kapt") version "$kotlinVersion"
}

group = "com.example"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_11

repositories {
    mavenCentral()
}

dependencies {
    // You probably do not need this for your project, so I commented it out
//    implementation("org.apache.commons:commons-text:1.8")

    // SourceSets
    sourceSets.main {
        withConvention(KotlinSourceSet::class) {
            kotlin.srcDirs("src/main/kotlin")
        }
    }
    sourceSets.test {
        withConvention(KotlinSourceSet::class) {
            kotlin.srcDirs("src/main/kotlin")
        }
    }

}

tasks.withType<Test> {
    useJUnitPlatform()
    testLogging {
        events("passed", "skipped", "failed")
    }
    systemProperty("spring.profiles.active", "test")
}

tasks.withType<KotlinCompile> {
    kotlinOptions {
        freeCompilerArgs = listOf("-Xjsr305=strict")
        jvmTarget = "11"
    }
}

Запустите этот скрипт с ./gradlew -q hello, чтобы проверить, работает он или нет.

1 Новый задача hello существует там только для того, чтобы продемонстрировать, что импорт работает, она не нужна в окончательном сценарии сборки, который вы бы использовали в своем проекте.

...