java.lang.NoClassDefFoundError: clojure/lang/IFn in aws lambda

java.lang.NoClassDefFoundError: clojure/lang/IFn in aws lambda

我正在关注来自 aws 博客的教程:https://aws.amazon.com/blogs/compute/clojure/ 到 运行 用 clojure 编写的 aws lambda 函数。

我使用生成 jar 文件的 lein uberjar 编译代码。

代码:

project.clj

(defproject lambda-clj-examples "0.1.0"
  :dependencies [[org.clojure/clojure "1.7.0"]
                 [org.clojure/data.json "0.2.6"]
                 [com.amazonaws/aws-lambda-java-core "1.0.0"]]
  :aot :all)

src/hello.clj

(ns hello
  (:gen-class
   :methods [^:static [handler [String] String]]))

(defn -handler [s]
  (str "Hello " s "!"))

创建函数的命令

aws lambda create-function \
  --function-name clj-hello \
  --handler hello::handler \
  --runtime java8 \
  --memory 512 \
  --timeout 10 \
  --role arn:aws:iam::myawsaccountid:role/basic_lambda_role \
  --zip-file fileb://./target/lambda-clj-examples-0.1.0-standalone.jar \
  --region us-east-1

当我转到 aws 控制台中的函数并调用它时,返回了以下消息:

{
  "errorMessage": "Error loading class PojoHandler: clojure/lang/IFn",
  "errorType": "java.lang.NoClassDefFoundError"
}

日志输出为:

Error loading class hello: clojure/lang/IFn: java.lang.NoClassDefFoundError
java.lang.NoClassDefFoundError: clojure/lang/IFn
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
Caused by: java.lang.ClassNotFoundException: clojure.lang.IFn
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 2 more

为了确保我的独立 jar 文件具有 IFn 依赖性,我 运行

jar tf target/lambda-clj-examples-0.1.0-standalone.jar | grep "IFn.class"

输出为

clojure/lang/IFn.class

这似乎是个好兆头。

我是否应该做一些其他事情来使这个功能起作用?

在此先感谢您的帮助

编辑:使用正确的处理程序更新了 lambda 创建命令。

编辑 2:我意识到我的本地 Java 版本 11,而不是 Java 8,正如@Simon 在他的回答评论中指出的那样,结果证明这是问题所在。

您用来调用 create-function 的真实命令是什么?您粘贴的示例来自博客,不能替代 awsaccountid。 JAR 可能没有作为二进制对象正确上传到 Lambda(即错误的路径)。

我也看不到你在 hello.clj 中添加 POJO 处理的位置,因为你通过了 --handler PojoHandler::handlepojo