首页 > 解决方案 > AWS Lambda 上的 Java 类加载差异?

问题描述

我在 AWS Lambda 上使用 javax.mail 包时遇到问题。

当尝试获取电子邮件的内容时,getContent() 方法MimeMultipart在本地运行时返回一个对象。当运行挂载到 AWS lambda java8 docker 映像时,它返回IMAPInputStream.

我已经看到了涉及在当前线程上设置类加载器的解决方案,如下所示:Thread.currentThread().setContextClassLoader(this.class.getClassLoader());

但是,这对我不起作用。本地运行时的类加载器与针对 lambda java8 docker 映像运行时的​​类加载器不同。本地:sun.misc.Launcher$AppClassLoader 码头工人:java.net.URLClassLoader

我尝试使用系统类加载器显式加载类,sun.misc.Launcher$AppClassLoader如下所示:

Class c = java.lang.ClassLoader.getSystemClassLoader().loadClass("helpers.MailReader");
MailReader mail = (MailReader)c.newInstance();

这在本地运行时可以正常工作,但对于 docker 映像再次失败:

java.lang.ClassNotFoundException: helpers.MailReader

因此,跨环境的系统类加载器有些不同。我对 Java 了解不多,而且似乎我只是缺少一些简单的东西,并使它变得比实际更复杂。可能产生这种情况的环境可能有什么不同?

编辑:从 javax.activation.debug 调试输出:

MailcapCommandMap: load HOME
new MailcapFile: file /home/sbx_user1051/.mailcap
MailcapCommandMap: load SYS
new MailcapFile: file /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.32.amzn1.x86_64/jre/lib/mailcap
MailcapCommandMap: load JAR
MailcapCommandMap: getResources
MailcapCommandMap: URL file:/var/task/META-INF/mailcap
new MailcapFile: InputStream
parse: text/plain;;     x-java-content-handler=com.sun.mail.handlers.text_plain
  Type: text/plain
    Command: content-handler, Class: com.sun.mail.handlers.text_plain
parse: text/html;;      x-java-content-handler=com.sun.mail.handlers.text_html
  Type: text/html
    Command: content-handler, Class: com.sun.mail.handlers.text_html
parse: text/xml;;       x-java-content-handler=com.sun.mail.handlers.text_xml
  Type: text/xml
    Command: content-handler, Class: com.sun.mail.handlers.text_xml
parse: multipart/*;;        x-java-content-handler=com.sun.mail.handlers.multipart_mixed; x-java-fallback-entry=true
  Type: multipart/*
    Command: content-handler, Class: com.sun.mail.handlers.multipart_mixed
parse: message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822
  Type: message/rfc822
    Command: content-handler, Class: com.sun.mail.handlers.message_rfc822
MailcapCommandMap: successfully loaded mailcap file from URL: file:/var/task/META-INF/mailcap
MailcapCommandMap: load DEF
new MailcapFile: InputStream
parse: image/gif;;      x-java-view=com.sun.activation.viewers.ImageViewer
  Type: image/gif
    Command: view, Class: com.sun.activation.viewers.ImageViewer
parse: image/jpeg;;     x-java-view=com.sun.activation.viewers.ImageViewer
  Type: image/jpeg
    Command: view, Class: com.sun.activation.viewers.ImageViewer
parse: text/*;;     x-java-view=com.sun.activation.viewers.TextViewer
  Type: text/*
    Command: view, Class: com.sun.activation.viewers.TextViewer
parse: text/*;;     x-java-edit=com.sun.activation.viewers.TextEditor
  Type: text/*
    Command: edit, Class: com.sun.activation.viewers.TextEditor
Merging commands for type text/*
MailcapCommandMap: successfully loaded mailcap file: /META-INF/mailcap.default
MailcapCommandMap: createDataContentHandler for multipart/alternative
  search DB #1
  search DB #2
  search fallback DB #1
    got content-handler
      class com.sun.mail.handlers.multipart_mixed
Can't load DCH com.sun.mail.handlers.multipart_mixed; Exception: java.lang.ClassNotFoundException: com/sun/mail/handlers/multipart_mixed
  search fallback DB #2

我在网上找到的与此相关的解决方案没有帮助

标签: javalambdajakarta-mail

解决方案


推荐阅读