使用 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
文件夹在我项目的根目录下,projectName
和projectVersion
是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/staging
中 Procfile
的内容如下所示:
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/
这是我的 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)
}
是否有一种干净的方法可以将额外的根文件夹添加到使用默认 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
文件夹在我项目的根目录下,projectName
和projectVersion
是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/staging
中 Procfile
的内容如下所示:
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/
这是我的 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)
}