Различия в загрузке классов Java на AWS Lambda? - PullRequest
0 голосов
/ 25 июня 2018

У меня проблемы с использованием пакета javax.mail на AWS Lambda.

При попытке получить содержимое письма метод getContent () возвращает объект MimeMultipart при локальном запуске.При запуске, смонтированном в образе AWS lambda java8 docker, он возвращает IMAPInputStream.

Я видел решения этого, которые включают установку загрузчика классов в текущем потоке, например: Thread.currentThread().setContextClassLoader(this.class.getClassLoader());

Однако это не сработало для меня.Загрузчик классов при локальном запуске отличается от загрузчика классов при работе с образом док-станции lambda java8.Local: sun.misc.Launcher$AppClassLoader Docker: java.net.URLClassLoader

Я попытался явно загрузить класс с помощью системного загрузчика классов sun.misc.Launcher$AppClassLoader следующим образом:

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

Это прекрасно работает при локальном запуске, носнова происходит сбой в образе докера с этим:

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

Нет решений, которые я нашел в Интернете, связанных с этим, помогло

...