使用 Gradle 将 .ebextensions 添加到 Spring Boot Jar 的简洁方法

Clean way of adding .ebextensions to Spring Boot Jar using Gradle

是否有一种干净的方法可以将额外的根文件夹添加到使用默认 bootRepackage 生成的 Spring 引导 Jar 文件中。在我的例子中,我需要 AWS beanstalk 的 .ebextenions 文件夹。

我知道我可以破解它——例如在 bootRepackage 之后添加另一个任务来解压缩、重新打包(再次)和重新压缩。有更清洁的方法吗?

谢谢

.. 我试过的两种方法(没用):

jar {
    from('src/main/ebextensions') {
        into('ebextensions')
    }
}

bootRepackage {
    from('src/main/ebextensions') {
        into('ebextensions')
    }
}

我仍在努力部署 Spring 自己引导至 EBS...

我认为该文件夹必须命名为 .ebextensions(注意前导点)。所以你会说 into('./.ebextensions') 而不是 into('ebextensions').

或者,您可以尝试上传包含您的 JAR 和 .ebextensions 文件夹的 ZIP 文件:

task zip(type: Zip, dependsOn: bootRepackage) {
    from ('./.ebextensions') {
        into '.ebextensions'
    }
    from (jar.outputs.files) {
        into '.'
    }
    destinationDir project.buildDir
}

对于 Grails 3,我使用 gradle clean dist 创建一个包含用于 EB 分发的 .war 的 .zip 文件,并使用 Procfile 来描述 Spring引导命令行。 .ebextensions文件夹在我项目的根目录下,projectNameprojectVersionbuild.gradle文件中定义的变量:

task dist(type: Zip) {
    from war.outputs.files
    from "src/staging/Procfile" // this file allows us to control how ElasticBeanstalk starts up our app on its Java SE platform
    from('./.ebextensions') {
        into '.ebextensions'
    }
    rename { String fileName ->
        if (fileName == "${projectName}-${projectVersion}.war".toString()) {
            fileName.replace("${projectName}-${projectVersion}", "application")
        } else {
            fileName
        }
    }
}
dist.dependsOn assemble

src/stagingProcfile 的内容如下所示:

web: java -jar application.war

如果您将 src/main/ebextensions 文件夹移动到 src/main/resources/.ebextensions,它会被 jar 任务自动复制到 .jar 的根目录(连同 /resources 中的任何其他文件) ),在 EBS 期望的位置,无需任何额外的脚本。

这已经是你所能得到的最干净的了!

我的 .ebextensions 位于我项目的根目录下。这似乎对我有用。

war{ 来自('./.ebextensions'){ 进入'.ebextensions' } }

对于 Spring Boot 2 (Gradle) 如果 .ebextensions 位于项目的根目录,请使用以下任务:

bootJar {
    from('./.ebextensions') { into '.ebextensions' }
}

bootWar {
    from('./.ebextensions') { into '.ebextensions' }
}

这样Gradle将.ebextensions复制到应用程序包的根目录中。

但如果您更喜欢 convention over configuration,请将 .ebextensions 文件夹移动到 src/main/resources 中。资源目录的内容自动打包在 /BOOT-INF/classes/ 中(不需要脚本)。 .ebextensions 目录将在解压时被 EB 部署脚本发现。

2021 年 9 月

我试图在我的 jar 中添加 .ebextensions 文件夹,但似乎 elastic beanstalk 不再喜欢它了。

相反,我必须创建一个包含 jar 和 .ebextensions 文件夹的 zip 文件。

像这样

~/myapp.zip
|-- myapp.jar
|-- .ebextensions/

Doc

这是我的 gradle kts 代码:

val jarFilename = "myapp.jar"

val packageZip by tasks.register<Zip>("packageZip") {
    dependsOn("bootJar")
    archiveFileName.set("myapp.zip")
    destinationDirectory.set(layout.buildDirectory.dir("libs"))

    from("$buildDir/libs/$jarFilename")

    from("../.ebextensions") {
        into(".ebextensions")
    }
    from("../.platform") {
        into(".platform")
    }
}

tasks.register<Delete>("cleanLibs") {
    delete("$buildDir/libs/")
}

tasks.named<BootJar>("bootJar") {
    dependsOn("cleanLibs")

    this.archiveFileName.set(jarFilename)

    finalizedBy(packageZip)
}