【问题标题】:java.lang.NoClassDefFoundError: clojure/lang/IFn in aws lambdajava.lang.NoClassDefFoundError: clojure/lang/IFn in aws lambda
【发布时间】:2021-06-23 18:25:09
【问题描述】:

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

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

代码:

项目.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 在他的回答的评论中指出的那样,这原来是问题所在。

【问题讨论】:

    标签: amazon-web-services aws-lambda clojure leiningen


    【解决方案1】:

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

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

    【讨论】:

    • 你是对的。我粘贴了错误的create-function 命令。现在是正确的。即使我通过 aws 控制台创建函数,并手动上传 jar 文件,也会发生同样的问题。
    • 另外,之前忘记评论了。我正在使用我创建的角色的 arn。只需将 accountid 替换为 myawsaccountid 即可不公开该信息。
    • 你确定你用正确的例子来构建你的 jar 吗?也许你没有使用 jdk8?
    • 以下是我在环境中执行的步骤:pastebin.com/Prvi2P6r
    • 西蒙,你是对的。我只是忽略了我的 java 版本是 11 的事实。将我的本地 java 指向 jdk8,重新运行lein uberjar,更新了 lambda,一切正常。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    相关资源
    最近更新 更多