1

我有一个简单的应用程序......但考虑到即使是“hello world”也可以作为示例。我正在用 gradle kotlin dsl 构建。

我已经应用了应用程序插件,并设置了 mainClassName,但我得到的唯一 jar(在 /build/libs 中)不包含库,因此不能简单地使用“java 文件名”运行。事实上,出于某种原因,我仍然需要给它一个主类。

但我真正的问题是,“用库(胖罐子)作为工件生产罐子的最简单方法是什么?”

我会认为应用程序插件会有一个选项吗?

4

2 回答 2

1

正如@hotkey 指出的那样,您可以像这样使用https://github.com/johnrengelman/shadow插件:

在您的依赖项和以下内容中:

classpath 'com.github.jengelman.gradle.plugins:shadow:<version>'

替换<version>为当前版本。

并应用插件:

apply plugin: 'com.github.johnrengelman.shadow'

然后您就可以使用该shadowJar任务了。

于 2018-08-19T15:57:58.313 回答
1

使用 Gradle Kotlin DSL 有两种选择:

  1. 建立自己的任务。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) }
        })
    }
    
  2. 使用影子插件

    plugins {
        id("com.github.johnrengelman.shadow") version "4.0.4"
    }
    

    它将添加shadowJar任务,可以像这样调用:gradle build shadowJargradle 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)
    }
    
于 2019-01-29T22:27:45.630 回答