当我调用应用程序URL时,将我的WAR文件(成功地)部署到Elastic Beanstalk会给我一个404 Not Found。我可以在/var/lib/tomcat8/webapps/ROOT/中看到一个application.war文件,而不是META-INF和WEB-INF,后者在我手动部署时就在那里。
当我从S3中拉出WAR文件并手动将其部署到Elastic Beanstalk时,它就像一个护身符。注意:这与CodeBuild在我的管道中生成的WAR文件相同。更好的是,如果我将文件安全复制(scp)到我的本地计算机,并将其上传到Elastic Beanstalk,它也可以正常工作。
似乎在部署之前,一切都正常工作,一个工作的WAR文件甚至被部署到Elastic Beanstalk。
通过eb-activity.log
,我可以看到它识别了WAR文件,并将其从一个临时目录部署到/var/lib/tomcat8/webapps/ROOT
,但是它没有解压,容器/WAR服务器也没有重新启动。
如何使用CodePipeline正确部署WAR文件?
发布于 2019-07-22 06:07:04
似乎近三年后的AWS Codepipeline还不是"WAR文件部署友好的“。正如@Azeq在评论中指出的那样,标准的Elastic Beanstalk部署过程不会解压缩war文件,也不会真正部署任何东西。Tomcat报告成功,因为复制的文件没有错误,但是CodePipeline不会解压缩war文件。
解决方案是以分解形式提供工件(已经解压)。为此,请修改构建后阶段和CodeBuild buildspec.yml的工件定义:
version: 0.2
phases:
install:
runtime-versions:
java: openjdk8
pre_build:
commands:
- echo CODEBUILD_RESOLVED_SOURCE_VERSION $CODEBUILD_RESOLVED_SOURCE_VERSION
build:
commands:
- mvn compile
post_build:
commands:
- mvn package
- mkdir artifact <-- create folder to extract war file content
- unzip target/my.war -d artifact/ <-- unzip to that folder
artifacts:
files:
- artifact/**/* <-- reference all those files as the artifact
name: artifact
cache:
paths:
- '/root/.m2/**/*'
注意构建后阶段中的mkdir
和unzip
命令,以及artifacts
部分中的files
定义是如何编写的。根据CodeBuild documentation,**/*
意味着所有文件都是递归的。
发布于 2016-12-22 02:14:50
我试图复制您所面临的问题。我认为在创建"war“文件时,您会将包含"META-INF”和"WEB-INF“文件夹的文件夹作为"war”输出文件的根目录。
相反,您应该将所有文件(在上面的文件夹中)放在"war“文件中,而不是根级别的文件夹。
发布于 2020-08-11 06:51:26
我也为此挣扎了一段时间。最后,我能够通过让buildspec.yml从post_build部分中构建的war文件中提取WEB-INF目录来解决这个问题
由于AWS在您的工件周围放置了一个zip包装器,因此它在弹性豆茎实际需要的周围添加了另一个文件夹级别
version: 0.2
phases:
install:
runtime-versions:
java: corretto11
build:
commands:
- mvn compile
post_build:
commands:
- mvn package
- mkdir artifact
- unzip target/demo-0.0.1-SNAPSHOT.war -d artifact/
- mv artifact/WEB-INF WEB-INF
artifacts:
files:
- WEB-INF/**/*
name: artifact
https://stackoverflow.com/questions/41039374
复制相似问题