У меня есть build.gradle.kts
для небольшого чистого проекта kotlin (я знаю, что использую несколько нестандартные исходные пути):
plugins {
kotlin("jvm") version "1.3.72"
}
repositories { mavenCentral() }
dependencies {
implementation(kotlin("stdlib-jdk8"))
testImplementation("org.jetbrains.kotlin:kotlin-test")
testImplementation("org.jetbrains.kotlin:kotlin-test-junit")
}
sourceSets["main"].java.srcDir("src")
sourceSets["test"].java.srcDirs("test")
sourceSets {
create("demo")?.let {
it.java.srcDir("demo")
// Also tried: it.java.srcDirs("src", "demo")
it.compileClasspath += main.get().output
it.runtimeClasspath += main.get().output
}
}
tasks {
compileKotlin {
kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
kotlinOptions.jvmTarget = "1.8"
}
}
listOf("InteractiveClient", "LockingBufferDemo").forEach {
tasks.register<Jar>(it) {
manifest { attributes["Main-Class"] = "${it}Kt" }
from(sourceSets.main.get().output)
from(sourceSets["demo"].output) {
include("**/${it}Kt.class")
}
dependsOn(configurations.runtimeClasspath)
from({
configurations.runtimeClasspath.get().filter {
it.name.endsWith("jar") }.map { zipTree(it) }
})
}
}
Когда я пытаюсь запустить один из "демонстрационные" задачи jar на основе sourceSet ("InteractiveClient" и "LockingBufferDemo"), 1 Я получаю длинный список ошибок «Невозможно получить доступ к встроенному ...», указывающий, что kotlin stdlib не является
Фактическая неудачная задача - compileDemoKotlin
, поэтому я попытался миметически добавить в блок tasks
:
withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
this.kotlinOptions.jvmTarget = "1.8"
}
Что не имеет значения.
Что для меня странно, так это то, что демонстрационный материал изначально был в test
sourceSet, и изменив приведенное выше обратно на это (удалив определение, изменив from(sourceSets["demo"]...
на from(sourceSets.test...
в задачах jar и переместив исходный файл) устраняет проблему. Это работает.
Я не хочу, чтобы это было в автоматических тестах. Думаю, я мог бы поместить их в ветки набора main
или test
, а затем использовать шаблон from() { exclude(...
при создании банок, но это кажется неудобным и ненужным.
Как мне сделать получить настраиваемый исходный код для компиляции с учетом зависимостей проекта по умолчанию?
- См. этот другой мой недавний вопрос о
from(... include(
в задачах jar.