当前位置: 首页 > 知识库问答 >
问题:

如何用Gradle Kotlin脚本创建胖罐子?

史骏祥
2023-03-14

如标题所示,我想知道如何修改gradle。建筑kts以创建一个唯一的jar,其中包含所有依赖项(包括kotlin lib)。

我在Groovy中找到了这个示例

//create a single Jar with all dependencies
task fatJar(type: Jar) {
    manifest {
        attributes 'Implementation-Title': 'Gradle Jar File Example',
            'Implementation-Version': version,
            'Main-Class': 'com.mkyong.DateUtils'
    }
    baseName = project.name + '-all'
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar
}

但我不知道我怎么能用kotlin写,除了:

task("fatJar") {

}

共有3个答案

柴赞
2023-03-14

你可以使用ShadowJar插件来构建一个胖罐子:

import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar

buildscript {
    repositories {
        mavenCentral()
        gradleScriptKotlin()
    }
    dependencies {
        classpath(kotlinModule("gradle-plugin"))
        classpath("com.github.jengelman.gradle.plugins:shadow:1.2.3")
    }
}

apply {
    plugin("kotlin")
    plugin("com.github.johnrengelman.shadow")
}

repositories {
    mavenCentral()
}

val shadowJar: ShadowJar by tasks
shadowJar.apply {
    manifest.attributes.apply {
        put("Implementation-Title", "Gradle Jar File Example")
        put("Implementation-Version" version)
        put("Main-Class", "com.mkyong.DateUtils")
    }

    baseName = project.name + "-all"
}

只需使用“shadowJar”运行任务。

注意:这假设您使用的是GSK 0.7.0(最新的02/13/2017)。

丁慈
2023-03-14

这里是如何做到这一点作为Gradle 6.5.1,静态编程语言/静态编程语言-MultiPlatform 1.3.72,利用一个build.gradle.kts文件,而不使用一个额外的插件,这似乎是不必要的和多平台的问题;

注意:事实上,从我所知,很少有插件能与多平台插件很好地配合,这就是为什么我怀疑它的设计理念本身如此冗长的原因。它实际上是相当优雅的IMHO,但不够灵活或有足够的文档记录,所以即使没有额外的插件,也需要大量的尝试和错误设置。

希望这能帮助其他人。

kotlin {
    jvm {
        compilations {
            val main = getByName("main")
            tasks {
                register<Jar>("fatJar") {
                    group = "application"
                    manifest {
                        attributes["Implementation-Title"] = "Gradle Jar File Example"
                        attributes["Implementation-Version"] = archiveVersion
                        attributes["Main-Class"] = "[[mainClassPath]]"
                    }
                    archiveBaseName.set("${project.name}-fat")
                    from(main.output.classesDirs, main.compileDependencyFiles)
                    with(jar.get() as CopySpec)
                }
            }
        }
    }
}
蒙光华
2023-03-14

这是一个不使用插件的版本,更像Groovy版本。

import org.gradle.jvm.tasks.Jar

val fatJar = task("fatJar", type = Jar::class) {
    baseName = "${project.name}-fat"
    manifest {
        attributes["Implementation-Title"] = "Gradle Jar File Example"
        attributes["Implementation-Version"] = version
        attributes["Main-Class"] = "com.mkyong.DateUtils"
    }
    from(configurations.runtime.map({ if (it.isDirectory) it else zipTree(it) }))
    with(tasks["jar"] as CopySpec)
}

tasks {
    "build" {
        dependsOn(fatJar)
    }
}

这里也有解释

一些评论人士指出,这在较新的Gradle版本中不再适用。使用Gradle 5.4.1测试的更新:

import org.gradle.jvm.tasks.Jar

val fatJar = task("fatJar", type = Jar::class) {
    baseName = "${project.name}-fat"
    manifest {
        attributes["Implementation-Title"] = "Gradle Jar File Example"
        attributes["Implementation-Version"] = version
        attributes["Main-Class"] = "com.mkyong.DateUtils"
    }
    from(configurations.runtimeClasspath.get().map({ if (it.isDirectory) it else zipTree(it) }))
    with(tasks.jar.get() as CopySpec)
}

tasks {
    "build" {
        dependsOn(fatJar)
    }
}

注意configurations.runtimeClasspath.get()与(tasks.jar.get()作为CopySpec)的区别。

 类似资料:
  • 在运行Java8和Gradle6.3的Linux机器上,我需要构建一个由库混合而成的fat jar,一些库来自Maven Central,其他库来自位于存储库根部的本地目录,以及我的和: 运行和之后,如果我可以看到JAR中没有包含任何依赖项。 我的最终目标是使我的项目可执行为。我该怎么解决这个?

  • 我使用的是maven 3.6.1和maven shade plugin 2.3。我已经复制了下面pom文件中的shade插件部分。清单是在创建jar时创建的,但它没有引用主类。我正在使用mvnpackage命令创建jar。对如何解决这个问题有什么想法吗?

  • 我试图在NetBeans中建立一个胖罐子。当我点击clean时,它显示以下错误: C:\workspace\travel_agency\nbproject\build-impl.xml:63:源资源不存在:C:\workspace\travel_agency\dist\nblibraries.properties 然后单击错误,它会将我发送到build-imple.xml文件中的以下行:

  • 我正在用一个胖罐子塑造一个码头工人的形象。我使用插件构建jar,使用构建Docker映像。我对SBT不是很熟悉,我遇到了以下问题。 > 构建映像的步骤之一是复制胖罐子。由于assembly插件在中创建jar,因此我需要知道确切的和jar名称。程序集似乎有一个键,但我不确定如何访问它。我尝试了以下失败的方法。 帮助

  • 问题内容: 这听起来像是一个非常笼统的问题,但这是正确的。 我有一个要求,以创建我的应用程序配置脚本,将生成的这种配置的结果(基本,,)。我的问题是,我应该从哪里开始构建?有没有我可以效仿的例子? 问题答案: 要创建标准的“配置”脚本,您需要GNU autoconf。您可能还需要GNU automake和libtool。 有大量的文档和指导。谷歌搜索“ autoconf automake howt

  • 我在 Jenkins 中创建了一个管道作业,我需要创建一个管道脚本来显示开发阶段的失败和不稳定的构建。在 Jenkins 2.0 中创建此脚本的步骤是什么,或者是否有任何示例管道脚本