当前位置: 首页 > 知识库问答 >
问题:

如何在AWS Lambda运行时上查看实际的java依赖项/库

米承嗣
2023-03-14

我有自定义逻辑,它定义了杰克逊应该如何在AWS lambda函数中序列化和反序列化域对象。AWS lambda函数使用AWS lambda运行时java 11(amazon-corretto-11)部署在AWS上。在本地测试时,序列化工作正常,但在AWS中则不然。

如何找出AWS lambda运行时中实际使用的java依赖项和依赖项的版本?

在我的具体案例中,我想了解的是杰克逊依赖的版本。

共有2个答案

仉成益
2023-03-14

@马德海德:安萨雷应该是前进的方向。但我认为有一种方法可以让你知道,只要稍微进行一点逆向工程,依赖关系是什么。

但首先,正如@jccampos提到的

您不应该依赖序列化框架的任何其他功能,例如注释。如果您需要自定义序列化行为,您可以使用原始字节流来使用您自己的序列化。

据我了解,那篇文字取自https://docs.aws.amazon.com/lambda/latest/dg/java-programming-model-req-resp.html

当让AWS Lambda环境处理序列化和反序列化时,您无法控制。反序列化将在lambda函数之外的lambda环境中进行。AWS Lambda环境将使用它自己的依赖项,该依赖项未打包在Lambda函数中。这就是为什么InputStream是一个更好的选择,因为在脱盐时,您可以控制使用哪个库。

AWS在反序列化时使用它自己定制的Jackson版本,并在com中打包。亚马逊。第三方。杰克逊。如果您对正在使用的版本感兴趣,可以下载maven project aws java sdk捆绑包,其中包含包含第三方库的jar(并提取jar以查找第三方库的版本)。我猜lambda环境使用的是该依赖关系的一个更高版本(也许有些人可以通过源代码来帮助确认这一点)。

最后,我尝试将aws java sdk包作为maven中提供的范围,然后打印出com的包信息。亚马逊。第三方。杰克逊。数据绑定。一个lambda中的ObjectReader。它导致了NoClassDefFoudError,这应该表明第三方jackson依赖项只能从lambda函数之外的AWS lambda环境中访问。

萧凡
2023-03-14

与其尝试对运行时进行逆向工程(这可能很难实现),不如试着关注您的问题:运行时提供的序列化不起作用。

您可以做的是重构您的处理程序函数以接受不是您的类的对象(这样,反序列化发生在运行时,您会得到POJO),而是原始请求(使用APIGatewayProxyRequestEventfromcom.amazonaws: aws-lambda-java-events如果您使用的是API Gateway)或InputStream。这样,您将获得原始有效负载,然后您可以按照自己的意愿解析它。在Java的AWS Lambda函数处理程序中阅读更多信息。您还需要在部署包中包含您的依赖项(google for"胖jar")。

 类似资料:
  • 我知道如何查看Android Studio项目中的所有依赖项,但它没有显示哪些库需要哪些。他们只是全部分组在一起。是否有一种方法可以查看我在build.gradle文件中声明的每个特定依赖项需要哪些库?

  • 我正在更新一大组遗留java应用程序。当前构建使用ant,其依赖项来自每个项目的lib目录。依赖项是每个项目的一部分,并签入源代码管理。更新的目的是将构建转换为gradle,并使用maven存储库进行依赖关系管理。为了简单起见,遗留构建使用ant构造从其他项目的lib目录复制依赖项,如下所示: 这种方法用于编译和运行时依赖项。虽然这样做有效,但由于包含了许多在运行时不需要的JAR,因此会导致部署工

  • 是否可能在运行时检索特定maven依赖项的版本? 例如。对于pom.xml: 我想检索具有工件ID的特定依赖项的版本。

  • 使用STS点击pom.xml文件时,我可以查看这些选项卡 如何使用intelliJ IDEA,特别是依赖层次结构来查看所有这些选项卡?我试图通过右键单击pom来查看它。xml

  • 问题内容: Eclipse捆绑包(例如,在激活器代码中)如何在运行时找到依赖的Bundle实例?我想找到Eclipse选择满足依赖要求的捆绑软件,我不想自己解释清单。 一个例子:我想在我当前捆绑包所依赖的所有捆绑包中找到所有名为“ marker.txt”的资源。还有传递依赖。为了做到这一点,我需要能够找到所有这些捆绑包。 问题答案: 没有简单的方法来确定依赖关系。最好的方法是通过PackageAd