我有一个简单的应用程序......但考虑到即使是“hello world”也可以作为示例。我正在用 gradle kotlin dsl 构建。
我已经应用了应用程序插件,并设置了 mainClassName,但我得到的唯一 jar(在 /build/libs 中)不包含库,因此不能简单地使用“java 文件名”运行。事实上,出于某种原因,我仍然需要给它一个主类。
但我真正的问题是,“用库(胖罐子)作为工件生产罐子的最简单方法是什么?”
我会认为应用程序插件会有一个选项吗?
我有一个简单的应用程序......但考虑到即使是“hello world”也可以作为示例。我正在用 gradle kotlin dsl 构建。
我已经应用了应用程序插件,并设置了 mainClassName,但我得到的唯一 jar(在 /build/libs 中)不包含库,因此不能简单地使用“java 文件名”运行。事实上,出于某种原因,我仍然需要给它一个主类。
但我真正的问题是,“用库(胖罐子)作为工件生产罐子的最简单方法是什么?”
我会认为应用程序插件会有一个选项吗?
正如@hotkey 指出的那样,您可以像这样使用https://github.com/johnrengelman/shadow插件:
在您的依赖项和以下内容中:
classpath 'com.github.jengelman.gradle.plugins:shadow:<version>'
替换<version>
为当前版本。
并应用插件:
apply plugin: 'com.github.johnrengelman.shadow'
然后您就可以使用该shadowJar
任务了。
使用 Gradle Kotlin DSL 有两种选择:
建立自己的任务。Gradle文档中给出了一个示例
tasks.register<Jar>("uberJar") {
appendix = "uber"
from(sourceSets.main.get().output)
dependsOn(configurations.runtimeClasspath)
from({
configurations.runtimeClasspath.get().filter { it.name.endsWith("jar")}.map { zipTree(it) }
})
}
使用影子插件
plugins {
id("com.github.johnrengelman.shadow") version "4.0.4"
}
它将添加shadowJar任务,可以像这样调用:gradle build shadowJar
或gradle build shadowJar -x test
跳过测试
通常需要包括日志记录,可以这样完成:
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import com.github.jengelman.gradle.plugins.shadow.transformers.Log4j2PluginsCacheFileTransformer
tasks.withType<ShadowJar> {
// the name of the file will be comprised of the basename and version, e.g. $baseName-$version.jar
baseName = "shadow"
transform(Log4j2PluginsCacheFileTransformer::class.java)
}