Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何减少Eclipse中用JAVA编写的AWS Lambda代码的大小_Java_Amazon S3_Aws Sdk_Aws Lambda - Fatal编程技术网

如何减少Eclipse中用JAVA编写的AWS Lambda代码的大小

如何减少Eclipse中用JAVA编写的AWS Lambda代码的大小,java,amazon-s3,aws-sdk,aws-lambda,Java,Amazon S3,Aws Sdk,Aws Lambda,我是一名android开发人员,正在探索AmazonAWS作为我未来的应用程序的后端选项。我探索过各种AWS服务,比如dynamoDB、S3、SES和使用JAVA的酷酷lambda特性。在学习过程中,我发现/准备了一个代码,用于为上传到S3 bucket的每个图像创建缩略图。我在EclipseIDE中成功地用java编写了Lambda代码,并且能够通过AWS控制台上传并使用它,达到预期目的 我担心的是,当我将JAVA Lambda代码上传到AWS时,它的大小似乎为49MB。当我寻找原因时,我发现

我是一名android开发人员,正在探索AmazonAWS作为我未来的应用程序的后端选项。我探索过各种AWS服务,比如dynamoDB、S3、SES和使用JAVA的酷酷lambda特性。在学习过程中,我发现/准备了一个代码,用于为上传到S3 bucket的每个图像创建缩略图。我在EclipseIDE中成功地用java编写了Lambda代码,并且能够通过AWS控制台上传并使用它,达到预期目的

我担心的是,当我将JAVA Lambda代码上传到AWS时,它的大小似乎为49MB。当我寻找原因时,我发现在AWSSDKforJava的项目中使用了大量JAR。这是正常的还是我可以减少上传代码的大小。请指导我如何有效地缩小尺寸。我还看到了node.js Lambda代码,它仅以KBs表示。也许我做了一些错事


请帮助…

简单回答-您做得很好,包大小不能减小到与node.js应用程序相当的大小

对于node.js lambda,amazon提供了AWS SDK库,因此您只需上传自己的代码和第三方库。但是对于java lambda,AWS SDK必须与应用程序打包在一起


但是,您可以通过仔细选择要包含哪些库并排除不必要的依赖项来减小包的大小。

根据所包含的库,JAR大小为49 MB对我来说似乎有点大。如果您包含完整的AWS SDK(所有服务),这会给您的JAR增加相当大的容量。我假设您自己的代码和其他库的大小是标称的。如果您使用的是Maven,那么您可以只包含您需要的服务(例如:S3)的库,而不包括您不需要的库

一个好的资源是博客文章。虽然从技术上讲这是一个稍微不同的主题,但它展示了Java中AWS SDK包管理的最佳实践。通过将包
aws-java-sdk-s3
而不是
aws-java-sdk
作为示例,您将看到包大小的大幅减少,aws有很多服务,它们的完整sdk相当大


我看到的许多基于Java的Lambda函数的部署大小为10 MB到13 MB,这取决于我需要包含的其他第三方库。仅仅根据Java部署工作的性质,您肯定无法获得接近node.js的部署大小,但从您目前的情况来看,应该还有改进的余地。

我的第一个Java Lambda函数也相当大。我的HelloWorldJava函数是10+MB!当您在AWS网站上学习Java函数部署教程时,您会觉得有必要打包AWS sdk。不是

我已经对此进行了测试,并得出结论,没有必要打包AWS sdk来运行Lambda函数。如果您使用的是Maven,则可以通过以下方式将AWS sdk设置为提供:

<dependency>
  <groupId>com.amazonaws</groupId>
  <artifactId>aws-java-sdk</artifactId>
  <version>1.10.72</version>
  <scope>provided</scope>
</dependency>

亚马逊网站

您可能需要考虑查看开源JAR Surnkk/优化器。我发现它帮助我将lambda函数从15Mb减少到3Mb。我可能可以通过更仔细地使用proguard选项来降低成本,但我现在已经很高兴能够节省成本了

我对Scala lambda函数基于SBT的设置如下——但我认为,您应该对Java lambda函数进行类似的缩减

ProguardKeys.options in Proguard ++= Seq(
"-dontoptimize",
"-dontobfuscate",
"-dontnote",
"-dontwarn",
"-keep,includedescriptorclasses class mypackage.** { *; }",
)
您可以使用一个独立的jar(无依赖项),并且小于60K。减少的类数还可以大大减少Lambda冷启动时间(有关详细信息,请参阅项目)。问题是,您必须通过AWS API的文档了解更多关于AWS API的信息,而不是依赖IDE中的自动完成功能以及AWS SDK JAR中fat生成的代码。作为一个简单的示例,这是如何编码从Lambda处理程序中的s3 bucket读取对象的:

Client s3 = Client.s3().defaultClient().build();
String bytes = s3.path("myBucket", "myObject.txt").responseAsBytes();

这个例子是用com.github.davidmoten:aws轻量级客户机java:0.1.3编写的(但您应该检查项目的最新版本)。

Hi@Martijn,谢谢您的建议。然而,我对Maven项目并不熟悉,您能否以另一种方式帮助我,即使用EclipseNewProjet向导创建的常规项目。希望我清楚我的要求。@GrvJn您是如何创建JAR文件的?我使用Maven或SBT来管理我正在运行的项目的依赖关系。这将向您展示如何使用Maven和Eclipse创建部署包。在XML标记内,放置上面的代码以从JAR构建中排除SDK。请注意,如果您的函数正在执行AWS特定的操作,例如与DynamoDB或S3交互,则需要此SDK。我已经为您设置了一个演示github repo供您试用,您可以在此处获取它:我使用@MartijnvanderGrift给出的方法,我认为这不是真的(我希望是真的)。我认为它只对您有效,因为您实际上没有使用AWS SDK。如果您这样做了,您将在运行时遇到NoClassDefFoundError。感谢您的回复。。我不熟悉Maven项目,只了解简单的eclipse向导项目。你能用这种方式引导我删除依赖项吗?嗨,罗杰!,我是“proguard”的新手,请您指导我如何从一开始就在Eclipse中向Java Lambda代码添加/使用proguard。请帮我做这个。