Use of Gradle Kotlin DSL Jar.from()



我正在尝试为jar的Main-Class包含一个源文件 - 实际上我有一个此类文件的顶级目录,demo/,但我不希望它们都在一个jar中。 我想要单独的罐子,每个罐子只使用其中一个。

这似乎是 gradle 中的一种反模式,因为基本机制推断或更喜欢我应该将每个放在一个不同的sourceSet中。 呸。

随意阅读文档意味着Jar.from()这样可能很有用:"指定文件或目录...">

事实证明,"来源"可能有点用词不当。 下面是一个例子,一个典型的 kotlin 胖罐,增加了from("demo/LockingBufferDemo.kt")

val jar by tasks.getting(Jar::class) {
manifest { attributes["Main-Class"] = "LockingBufferDemoKt" }
from(sourceSets.main.get().output)
from("demo/LockingBufferDemo.kt")
dependsOn(configurations.runtimeClasspath)
from({
configurations.runtimeClasspath.get().filter {
it.name.endsWith("jar") }.map { zipTree(it) }
})
}         

原谅我的天真:猜猜什么最终不会在罐子里?LockingBufferDemo.class. 你猜怎么着?LockingBufferDemo.kt. 换句话说,这更像是一种资源,而不是一个来源,而最简单的答案却是死胡同。

另一种方法是将demo目录添加为独立sourceSet,然后使用from(sourceSets["demo"].get(),除了我找不到完成它的方法; 根据 IntelliJget()返回一个相当不透明的"提供程序",我在实际的 javadoc 中找不到它:1、2 我真的觉得我现在正沿着花园小径前进,周围的树林迅速变暗。

这不应该这么复杂。

如何将单个文件(或从此类派生的类(添加到 gradle 中的 jar 中,而不必将其单独放在目录中并为每个此类目录创建一个sourceSet

关于你在帖子开头的解释,你应该考虑自己创建多个Jar类型的任务,因为每个Jar类型的任务只会创建一个 JAR 文件,并且你"想要单独的 jar"。我认为您不应该使用不同的源代码集,因为所有文件最终都是JavaKotlin 源文件,并且以相同的方式处理(编译、测试、文档......多个源集会使此通用管道复杂化。

"指定源文件或目录..."事实证明,"来源"可能有点用词不当。

好吧,文档并不止于此,但它说"为了副本并创建一个子CopySpec"。因此,它不是源代码中的源代码,而是复制操作的源代码在 Gradle 中,创建归档(ZIP、JAR(的任务与复制文件的任务共享其 API,因为创建归档可以被视为将文件从源位置复制到目标位置(存档内部(。

因此,from方法可用于指定复制/存档的文件。但它不仅需要sourcePath参数,还需要闭包或配置操作。使用第二个参数,您可以将源文件或目录缩小到所需的一个文件,例如使用方法include

val jar by tasks.getting(Jar::class) {
manifest { attributes["Main-Class"] = "LockingBufferDemoKt" }
from(sourceSets.main.get().output) {
include("**/LockingBufferDemo.class")
}
dependsOn(configurations.runtimeClasspath)
from({
configurations.runtimeClasspath.get().filter {
it.name.endsWith("jar") }.map { zipTree(it) }
})
}

最新更新