AWS SAM:部署后,java8 / gradle应用程序失败并显示ClassNotFound(但在本地运行良好)

时间:2019-06-20 16:29:57

标签: amazon-web-services aws-lambda aws-sam-cli aws-sam

说明:

一个Java8应用程序在执行sam build; sam local invoke...之后在本地运行,但是当使用sam package; sam deploy进行部署时,失败并显示ClassNotFound异常

重现此问题的步骤:

  1. 初始化Java8 / gradle应用程序:sam init -r java8 -d gradle && cd sam-app
  2. 运行sam buildsam build --use-container
  3. 观察到该函数在本地成功运行(由于没有上面的sam构建而导致相同的ClassNotFound异常而失败):sam local invoke HelloWorldFunction --no-event
  4. 打包+部署:
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
  1. 在AWS Lambda控制台中,找到函数java8-gradle-test-HelloWorldFunction-...,添加任意测试事件,然后单击test

观察到的结果:

执行结果:失败

日志:

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 invokesam package发生的事情之间似乎存在一些意想不到的差异,而后者sam build不会拾取$(document).ready(function() { var cloneCount = 0; var bindFileChange = function (cloneCount){ let fileInput = $('input[type="file"][data-count="' + cloneCount +'"]'); fileInput.on('change', function (){ $(this).siblings('.image_Preview').attr('src', window.URL.createObjectURL(this.files[0])); }); }; $("button").click(function(){ cloneCount++; $("#id0").clone().attr('id', 'id'+ cloneCount).insertAfter("#id" + (cloneCount - 1)); $('#id' + cloneCount).find('input[type="file"]').first().attr('data-count', cloneCount); bindFileChange(cloneCount); }); });中的工件。

1 个答案:

答案 0 :(得分:0)

解决了!通过使用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

上的说明