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
我正在关注来自 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