使用 Gradle 将 .ebextensions 添加到 Spring Boot Jar 的干净方式

Posted

技术标签:

【中文标题】使用 Gradle 将 .ebextensions 添加到 Spring Boot Jar 的干净方式【英文标题】:Clean way of adding .ebextensions to Spring Boot Jar using Gradle 【发布时间】:2017-01-05 13:50:03 【问题描述】:

有没有一种干净的方法可以将额外的根文件夹添加到使用默认 bootRepackage 生成的 Spring Boot Jar 文件中。在我的情况下,我需要 AWS beanstalk 的 .ebextenions 文件夹。

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

谢谢

.. 我尝试过的两种方法(不起作用):

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


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

【问题讨论】:

【参考方案1】:

对于 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部署脚本发现。

【讨论】:

(SO poll)请在此处发表评论:您选择了 2 个解决方案中的哪一个? 新平台“Amazon Linux 2”不再解析 Jar 中的文件 docs.aws.amazon.com/elasticbeanstalk/latest/dg/…【参考方案2】:

我自己还在努力将 Spring Boot 部署到 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

【讨论】:

嗨,我的 Spring Boot 项目的根文件夹中有我的 .ebextensions 文件夹,我将上面的代码复制粘贴到我的 build.gradle 中,但我没有看到我的 .ebextensions 文件夹在我的 jar 文件的根文件夹中。我错过了什么?谢谢 这是一个隐藏文件夹,可能不会马上显示出来。【参考方案3】:

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

这就是你能得到的最干净的东西!

【讨论】:

【参考方案4】:

我的 .ebextensions 在我的项目的根目录中。这似乎对我有用。

战争 来自('./.ebextensions') 进入“.ebextensions”

【讨论】:

【参考方案5】:

对于 Grails 3,我使用 gradle clean dist 创建一个包含 .war 的 .zip 文件以用于 EB 分发,并使用 Procfile 来描述 Spring Boot 命令行。 .ebextensions 文件夹位于我的项目的基本目录中,projectNameprojectVersion 是在 build.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

【讨论】:

【参考方案6】:

2021 年 9 月

我尝试在我的 jar 中添加 .ebextensions 文件夹,但似乎弹性豆茎不再喜欢它了。

相反,我必须创建一个包含 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)

【讨论】:

以上是关于使用 Gradle 将 .ebextensions 添加到 Spring Boot Jar 的干净方式的主要内容,如果未能解决你的问题,请参考以下文章

在 Elastic Beanstalk 中,如何使用 .ebextensions 将现有安全组设置为负载均衡器?

如何在spring boot gradle项目的.jar根目录中构建一个文件夹?

如何使用 .ebextensions 将 Application Load Balancer 固定响应添加到 AWS Elastic Beanstalk

在 aws 中使用 ebextensions

多 Docker Elastic Beanstalk:上传 .ebextensions

如何在 .ebextensions 中获取负载均衡器的 ARN?