【问题标题】:AWS Lambda handlers in Java, the package is unavailableJava 中的 AWS Lambda 处理程序,该程序包不可用
【发布时间】:2019-01-25 20:59:14
【问题描述】:

我正在尝试用 Java 实现 AWS Lambda 处理程序。 我在我的 pom.xml 中使用了这个依赖:

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-lambda</artifactId>
    <version>1.11.487</version>
</dependency>

在我的 Java 代码中:

import com.amazonaws.services.lambda.runtimeContext;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEven;

IDE 抱怨没有 com.amazonaws.services.lambda 包(和子包)。尝试重新导入项目 - 没有区别。

完整的类名取自此处的 AWS 文档: https://docs.aws.amazon.com/lambda/latest/dg/java-programming-model-handler-types.html

我怀疑我使用了一些错误的依赖项。这里实际需要什么 Maven 依赖项?

【问题讨论】:

  • 查看@JacobG 的回答。您想要的库不在普通 SDK 中。您已将 client Lambda SDK 包含在您的 pom.xml 中。 This page 在解释库方面做得很好,但不是 100% 清楚。
  • 亚马逊 AWS 是否有可能改变了他们的 Java 包布局(尤其是 AWS Lambda 库)并且没有更新文档?
  • 我添加了一个扩展其他答案的答案。如果它回答了您的问题,请告诉我。
  • @stdunbar 在下面回答。感谢您的精彩解释。 Maven 依赖项有一个奇怪的问题。今天我什至尝试删除整个本地仓库,但并没有改变这种情况。

标签: java amazon-web-services maven


【解决方案1】:

Java Lambda 的东西有点令人困惑。您需要编写一个 Lambda 库和一个可选库来处理基于 Amazon 的事件。

这些库在this page 上有所记录。

要在 maven 中使用 aws-lambda-java-core 库,您需要使用:

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-lambda-java-core</artifactId>
    <version>1.2.0</version>
</dependency>

作为您的 Maven 依赖项。

要使用 aws-lambda-java-events(Lambda 事件库),请使用依赖项

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-lambda-java-events</artifactId>
    <version>2.2.5</version>
</dependency>

在你的pom.xml

在您的示例中,com.amazonaws.services.lambda.runtime.Contextcom.amazonaws.services.lambda.runtime.RequestHandler 来自 aws-lambda-java-core 库。 您的帖子看起来在第一次导入时遇到了复制/粘贴问题

但是com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEventcom.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent(同样,您的帖子中有错字)来自aws-lambda-java-events。这个库简化了对 AWS 事件的处理。您的代码看起来想要处理 API Gateway Proxy events

但是请注意,通过引入 aws-lambda-java-events 库,您会引入大量 AWS 库。例如,即使您的 Lambda 只需要 API Gateway 事件,您仍然会引入对 S3 库的依赖,因为事件库也处理 S3 事件。因此,您的 Lambda 部署包将比您不引入它时大得多。

作为事件库的替代方案,您可以使用 JsonPath 之类的东西从事件中提取您想要的内容。您的 Lambda 将类似于:

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
import com.jayway.jsonpath.JsonPath;

public class YourLambdaHandler implements RequestStreamHandler {
    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) {
        String accountId = JsonPath.read(inputStream, "$.requestContext.accountId");

它将从 API Gateway 事件中读取 accountId

毫无疑问,这种方式需要更多的工作,但如果您只是从活动中取出几件物品,那么它可能是一种更轻的方式。

编辑

您似乎遇到了构建/IDE 问题。所以,我能展示的最少的代码首先是一个工作的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.yourpackage.handler</groupId>
    <artifactId>apigateway</artifactId>
    <version>1.0</version>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-lambda-java-core</artifactId>
            <version>1.2.0</version>
        </dependency>

        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-lambda-java-events</artifactId>
            <version>2.2.5</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.1</version>
                <configuration>
                    <createDependencyReducedPom>false</createDependencyReducedPom>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

还有一个 Lambda 处理程序:

package com.yourpackage.handler;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent;

@SuppressWarnings("unused")
public class DemoHandler implements RequestHandler<APIGatewayProxyResponseEvent, String> {
    public String handleRequest(APIGatewayProxyResponseEvent apiGatewayProxyResponseEvent, Context context) {
        return "hello";
    }
}

你能从一个新环境开始尝试一下吗?

【讨论】:

  • 感谢您的精彩解释。但是,我的问题更奇怪:依赖项在我的本地存储库中, - 它们已成功获取。 “com.amazonaws.services.lambda”包及其子包在 jar 文件中 - aws-lambda-java-*.jar(核心,事件)。尽管如此,Maven 构建失败:“找不到符号”(com.amazonaws.services.lambda.runtime.events 包中的类 APIGatewayProxyResponseEven)。这里还有什么问题?
  • @user3791111 - 那是因为它是 APIGatewayProxyResponseEvent - 你错过了类名中的最后一个 t
  • 更正了名称。但是,当我尝试导入“com.amazonaws.services.lambda”以外的任何内容时,它会失败。在 IDE 中,我输入:“import com.amazonaws.services。”,而“lambda”不存在,就像没有带有这个包的库一样(jar 在那里,类在那里,-Maven 和IDE 不在乎)。
【解决方案2】:

以下依赖项对我有用

<dependencies>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-lambda-java-core</artifactId>
        <version>1.1.0</version>
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-lambda-java-events</artifactId>
        <version>2.2.6</version>
    </dependency>
</dependencies>

【讨论】:

    【解决方案3】:

    您是否尝试了整个 AWS 开发工具包?

    <!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk -->
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk</artifactId>
        <version>1.11.489</version>
    </dependency>
    

    【讨论】:

    • 尝试了1.11.490版本,并没有改变这种情况。
    猜你喜欢
    • 2016-08-06
    • 2021-05-20
    • 2021-09-14
    • 1970-01-01
    • 2018-03-10
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    相关资源
    最近更新 更多