2024 年 Clojure 状态调查中分享您的想法!

欢迎!请查看关于页面以获取有关该如何工作的更多信息。

0

我试图使用 Congitect 的 aws-api 库和 Java 8 运行时在 AWS Lambda 中从 S3 获取文件,但不断出现问题

(def s3 (aws/client {:api :s3}))

(defn open-file []
  (aws/invoke s3 {:op :GetObject :request {:Bucket "test-bucket" :Key "filename.txt"}}))

在调用 open-file 时,我遇到了以下错误

{
  ":cognitect.anomalies/category": {
    "sym": {
      "name": "fault",
      "namespace": "cognitect.anomalies"
    },
    "name": "fault",
    "namespace": "cognitect.anomalies"
  },
  ":cognitect.anomalies/message": "java.nio.ByteBuffer.flip()Ljava/nio/ByteBuffer;",
  ":cognitect.http-client/throwable": {
    "stackTrace": [
      {
        "methodName": "invokeStatic",
        "fileName": "http_client.clj",
        "lineNumber": 37,
        "className": "cognitect.http_client$empty_bbuf",
        "nativeMethod": false
      }
   ...

这是我的代码中的问题吗?它在不使用 Lambda 时似乎是有效的。

1 答案

+1

选中
 
最佳答案

我之前见过这个错误(不是在这个上下文中),隐约记得与 JDK 中的一些更改有关,例如反射性的东西。Lambda 中使用的是哪个 JDK 版本?

我追踪到了关于它的一个笔记——发生在在 Java 11 上进行 AOT 编译然后在 Java 8 上运行时。这种情况有适用的可能性吗?
AWS 仅支持 Java 8,我使用 JDK 8 编译了代码。
现在它正在工作。结果是代码是好的,但我使用 `fish` shell 的 `jenv`,它没有完全设置,所以我以为我在使用 JRE 8 编译,但实际上我使用的是 JRE 11。
你能检查一下其中一个类文件吗?

    javap -verbose <path/to/the.class> | grep major

主要版本 52 是 Java 8,55 是 Java 11
...