如何使用Gradle创建具有实现依赖性的可执行胖jar

时间:2018-03-14 12:40:43

标签: java gradle executable-jar gradle-plugin fatjar

我在Gradle 4.6中有一个简单的项目,并希望制作一个可执行的jar。我已经尝试了shadowgradle-fatjar-plugingradle-one-jarspring-boot-gradle-plugin个插件,但它们都没有添加我声明为implementation的依赖项(我不会'有任何compile个。它适用于compile,例如对于gradle-one-jar插件,但我希望有implementation个依赖项。

非常感谢!

5 个答案:

答案 0 :(得分:26)

您可以使用以下代码。

jar {
    manifest {
        attributes(
                'Main-Class': 'com.package.YourClass'
        )
    }
    from {
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
 }

请务必将com.package.YourClass替换为包含static void main( String args[] )的完全限定类名。

这将打包运行时依赖项。如果您需要更多信息,请查看docs

答案 1 :(得分:12)

基于已接受的答案,我需要再添加一行代码:

task fatJar(type: Jar) {
  manifest {
    attributes 'Main-Class': 'com.yourpackage.Main'
  }
  archiveClassifier = "all"
  from {
    configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
  with jar
}

没有此额外的行,它省略了我的源文件,只添加了依赖项:

configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }

答案 2 :(得分:2)

使用Gradle Kotlin DSL以类似的方式可以完成相同的任务:

val jar by tasks.getting(Jar::class) {
    manifest {
        attributes["Main-Class"] = "com.package.YourClass"
    }

    from(configurations.runtime.map { if (it.isDirectory) it else zipTree(it) })
}

答案 3 :(得分:1)

amqp://

这行对我来说是必不可少的。

答案 4 :(得分:0)

Kotlin 1.3.72和JVM插件Gradle 6.5.1

语法在所有这些平台中都在迅速改变

tasks {
    compileKotlin {
        kotlinOptions.jvmTarget = "1.8"
    }
    compileTestKotlin {
        kotlinOptions.jvmTarget = "1.8"
    }
    val main = sourceSets.main.get()
    //TODO
    register<Jar>("buildFatJar") {
        group = "app-backend"
        dependsOn(build)
        // shouldRunAfter(parent!!.tasks["prepCopyJsBundleToKtor"]) -> This is for incorporating KotlinJS gradle subproject resulting js file.
        manifest {
            attributes["Main-Class"] = "com.app.app.BackendAppKt"
        }

        from(configurations.compileClasspath.get().files.map { if (it.isDirectory) it else zipTree(it) })
        with(jar.get() as CopySpec)
        archiveBaseName.set("${project.name}-fat")
    }
}