AWS SAM:java8/gradle 应用在部署时因 ClassNotFound 而失败(但在本地运行良好)
AWS SAM: java8/gradle app fails with ClassNotFound when deployed (but runs fine locally)
描述:
java8 应用程序在执行 sam build; sam local invoke...
后在本地运行,但在使用 sam package; sam deploy
部署时失败并出现 ClassNotFound 异常
重现问题的步骤:
- 初始化一个 Java8/gradle 应用程序:
sam init -r java8 -d gradle && cd sam-app
- 运行
sam build
: sam build --use-container
- 观察函数在本地成功运行(这失败并出现相同的 ClassNotFound 异常,但没有上面的 sam 构建):
sam local invoke HelloWorldFunction --no-event
- 打包+部署:
sam package --template-file template.yaml --output-template-file packaged.yaml --s3-bucket <some bucket name>
sam deploy --template-file packaged.yaml --stack-name java8-gradle-test --capabilities CAPABILITY_IAM --region eu-west-2 --no-fail-on-empty-changeset
- 在 AWS Lambda 控制台中,找到函数
java8-gradle-test-HelloWorldFunction-...
,添加任意测试事件并单击测试
观测结果:
执行结果:失败
日志:
START RequestId: a5e25d74-4a0d-4763-b7a7-383aeede5c82 Version: $LATEST
Class not found: helloworld.App: java.lang.ClassNotFoundException
java.lang.ClassNotFoundException: helloworld.App
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
END RequestId: a5e25d74-4a0d-4763-b7a7-383aeede5c82
REPORT RequestId: a5e25d74-4a0d-4763-b7a7-383aeede5c82 Duration: 58.33 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 69 MB
预期结果:
与我 运行 sam local invoke
此功能时相同的成功响应。
sam local invoke
和 sam package
之间似乎存在一些意想不到的差异,后者没有从 sam build
中提取工件。
已解决!这可以通过使用 sam package --output-template-file packaged.yaml --s3-bucket <some bucket name>
来解决,即不指定模板文件。很明显,sam local invoke
正在拿起内置的,但我不允许 sam package
这样做。请参阅 https://github.com/awslabs/aws-sam-cli/issues/978
上的说明
描述:
java8 应用程序在执行 sam build; sam local invoke...
后在本地运行,但在使用 sam package; sam deploy
重现问题的步骤:
- 初始化一个 Java8/gradle 应用程序:
sam init -r java8 -d gradle && cd sam-app
- 运行
sam build
:sam build --use-container
- 观察函数在本地成功运行(这失败并出现相同的 ClassNotFound 异常,但没有上面的 sam 构建):
sam local invoke HelloWorldFunction --no-event
- 打包+部署:
sam package --template-file template.yaml --output-template-file packaged.yaml --s3-bucket <some bucket name>
sam deploy --template-file packaged.yaml --stack-name java8-gradle-test --capabilities CAPABILITY_IAM --region eu-west-2 --no-fail-on-empty-changeset
- 在 AWS Lambda 控制台中,找到函数
java8-gradle-test-HelloWorldFunction-...
,添加任意测试事件并单击测试
观测结果:
执行结果:失败
日志:
START RequestId: a5e25d74-4a0d-4763-b7a7-383aeede5c82 Version: $LATEST
Class not found: helloworld.App: java.lang.ClassNotFoundException
java.lang.ClassNotFoundException: helloworld.App
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
END RequestId: a5e25d74-4a0d-4763-b7a7-383aeede5c82
REPORT RequestId: a5e25d74-4a0d-4763-b7a7-383aeede5c82 Duration: 58.33 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 69 MB
预期结果:
与我 运行 sam local invoke
此功能时相同的成功响应。
sam local invoke
和 sam package
之间似乎存在一些意想不到的差异,后者没有从 sam build
中提取工件。
已解决!这可以通过使用 sam package --output-template-file packaged.yaml --s3-bucket <some bucket name>
来解决,即不指定模板文件。很明显,sam local invoke
正在拿起内置的,但我不允许 sam package
这样做。请参阅 https://github.com/awslabs/aws-sam-cli/issues/978