java - 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
我在网上找到的与此相关的解决方案没有帮助
解决方案
推荐阅读
- mysql - MySQL Fetch 多维数组
- java - 如何为 Selenium 测试创建可运行的 jar
- azure - Azure Linux Web App 未压缩 dotnet 核心的文件
- typescript - 通过 Object.entries 与 Object.keys 从对象文字中获取属性
- pandas - 熊猫分组条形图
- html - Bootstrap sidenav 选项卡内容导航无法正常工作
- javascript - 相同的代码是否可能在同一个浏览器中以不同的方式运行?
- jax-rs - 为什么在与 PriceResource Publisher 的多个连接中,只有一个获得流?
- javascript - Vuetify.js 如何排除 ress.css
- python - 网络应用python中频繁访问数据库的最佳解决方案