Ste*_*son 11 logging glassfish jakarta-mail java-ee-6
我正在尝试使用Glassfish 3.1提供的jar文件在Java EE 6中使用JavaMail设置简单的日志记录测试.关于这个问题似乎有很多问题,但我还没有找到任何有帮助的答案.我的测试代码如下所示:
import java.util.logging.Logger;
public class MyClass {
private static final Logger LOGGER = Logger.getLogger("MyClass");
public static void main(String[] args) {
LOGGER.severe("This is a test");
}
}
Run Code Online (Sandbox Code Playgroud)
我的logging.properties文件包含以下内容:
com.sun.mail.util.logging.MailHandler.mail.smtp.host={my mail hub FQDN}
com.sun.mail.util.logging.MailHandler.mail.smtp.port=25
com.sun.mail.util.logging.MailHandler.mail.to={me}
com.sun.mail.util.logging.MailHandler.mail.from={support address}
com.sun.mail.util.logging.MailHandler.level=WARNING
com.sun.mail.util.logging.MailHandler.verify=local
com.sun.mail.util.logging.MailHandler.subject=Application Error
com.sun.mail.util.logging.MailHandler.formatter=java.util.logging.SimpleFormatter
Run Code Online (Sandbox Code Playgroud)
我使用以下方法构建类:
javac -cp $AS_INSTALL/glassfish/modules/javax.mail.jar:$AS_INSTALL/install/lib/external/jaxb/activation.jar:. MyClass.java
Run Code Online (Sandbox Code Playgroud)
然后我运行程序使用:
java -cp $AS_INSTALL/glassfish/modules/javax.mail.jar:$AS_INSTALL/install/lib/external/jaxb/activation.jar:. -Djava.util.logging.config.file=logging.properties MyClass
Run Code Online (Sandbox Code Playgroud)
这会导致以下错误:
Sep 22, 2011 4:19:25 PM MyClass main
SEVERE: This is a test
java.util.logging.ErrorManager: 3: SEVERE: no object DCH for MIME type multipart/mixed;
boundary="----=_Part_1_26867996.1316722766145"
javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed;
boundary="----=_Part_1_26867996.1316722766145"
at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:877)
at javax.activation.DataHandler.writeTo(DataHandler.java:302)
at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1476)
at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1772)
at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1748)
at com.sun.mail.util.logging.MailHandler.toRawString(MailHandler.java:2196)
at com.sun.mail.util.logging.MailHandler.send(MailHandler.java:1597)
at com.sun.mail.util.logging.MailHandler.close(MailHandler.java:552)
at java.util.logging.LogManager.resetLogger(LogManager.java:693)
at java.util.logging.LogManager.reset(LogManager.java:676)
at java.util.logging.LogManager$Cleaner.run(LogManager.java:221)
javax.mail.MessagingException: IOException while sending message;
nested exception is:
javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed;
boundary="----=_Part_1_26867996.1316722766145"
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1141)
at javax.mail.Transport.send0(Transport.java:195)
at javax.mail.Transport.send(Transport.java:124)
at com.sun.mail.util.logging.MailHandler.send(MailHandler.java:1594)
at com.sun.mail.util.logging.MailHandler.close(MailHandler.java:552)
at java.util.logging.LogManager.resetLogger(LogManager.java:693)
at java.util.logging.LogManager.reset(LogManager.java:676)
at java.util.logging.LogManager$Cleaner.run(LogManager.java:221)
Caused by: javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed;
boundary="----=_Part_1_26867996.1316722766145"
at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:877)
at javax.activation.DataHandler.writeTo(DataHandler.java:302)
at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1476)
at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1772)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1099)
... 7 more
Run Code Online (Sandbox Code Playgroud)
我已经验证我的javax.mail.jar文件包含多部分处理程序:
unzip -l $AS_INSTALL/glassfish/modules/javax.mail.jar | grep multipart
2617 01-14-2011 15:37 com/sun/mail/handlers/multipart_mixed.class
Run Code Online (Sandbox Code Playgroud)
我甚至在启用激活调试的情况下运行程序.这向我展示了以下相关部分:
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
MailcapCommandMap: createDataContentHandler for multipart/mixed
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
Run Code Online (Sandbox Code Playgroud)
我甚至得到了类型text/plain的上述副本.
MailcapCommandMap: createDataContentHandler for text/plain
search DB #1
got content-handler
class com.sun.mail.handlers.text_plain
Can't load DCH com.sun.mail.handlers.text_plain; Exception: java.lang.ClassNotFoundException: com/sun/mail/handlers/text_plain
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
谢谢,史蒂夫
Jad*_* Gu 10
在发送邮件之前添加以下内容:
MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
CommandMap.setDefaultCommandMap(mc);
Run Code Online (Sandbox Code Playgroud)
我在我的Android应用程序中遇到了问题,但它确实有效.
我在这里找到了解决方案:
http://blog.hpxn.net/2009/12/02/tomcat-java-6-and-javamail-cant-load-dch/
虽然我想更多地了解为什么这是一个问题背后的细节以及这个-Xbootclasspath选项正在做什么来纠正问题.如果我像这样运行我的课:
java -Djava.util.logging.config.file=logging.properties -Xbootclasspath/p:/app/glassfish-3.1/glassfish/modules/javax.mail.jar MyClass
Run Code Online (Sandbox Code Playgroud)
它找到了必要的课程,我收到了我的电子邮件.现在我只需弄清楚如何将此配置转换为我的Glassfish服务器,并从这个简单的测试用例中尝试更"真实"的测试.
在我的情况下,我能够通过在send()之前添加这个来解决这个问题:
Thread.currentThread().setContextClassLoader( getClass().getClassLoader() );
Run Code Online (Sandbox Code Playgroud)
这是在链接博客中建议的,因此如果您想了解更多详细信息,请阅读它。感谢 Jerry Gu 将它链接到这里和原始博主。
网址:http : //blog.hpxn.net/2009/12/02/tomcat-java-6-and-javamail-cant-load-dch/
尽管我很想了解更多关于为什么这是一个问题的详细信息,以及这个 -Xbootclasspath 选项如何解决这个问题。
它与类加载器树有关。回想一下,子类加载器可以在父类加载器中查找类,但反之则不然。在示例程序中,类加载器树如下所示:
Running under JDK6, JDK7, and JDK8
+---Boot ClassLoader--+
| java.util.logging.* |
| javax.activation .* |
+---------------------+
^
|
+-----System ClassLoader------+
| javax.mail.* |
| com.sun.mail.handlers.* |
| com.sun.mail.util.logging.* |
+-----------------------------+
Run Code Online (Sandbox Code Playgroud)
当LogManager$Cleaner
关闭钩子运行时(JDK6+),上下文类加载器被迫启动类加载器,该类加载器无法找到该类com.sun.mail.handlers.text_plain
,因为它位于子类加载器中。因此,修改MailcapCommandMap
以包含 mailcap 类名并不能解决问题。当您使用该-Xbootclasspath
选项时,您会将所有相关类放置在引导类加载器中,该加载器对LogManager$Cleaner
. 但是,请勿修改您的系统来-Xbootclasspath
修复此问题。
相反,请升级到JavaMail 1.5.3或更高版本,其中包含 Bug K6552 的修复程序| GH133 - 在 MailHandler 中使用类加载器人体工程学。如果您想升级 GlassFish 的 JavaMail 模块,可以将其替换glassfish-X.X/glassfish/modules/javax.mail.jar
为更新版本的 JavaMail。
适用于 JavaMail 1.4.7 的不完整修复是将上下文类加载器设置为MailHandler
在关闭期间加载的类加载器。假设加载的类加载器MailHandler
应该能够找到激活代码。
如果您无法升级到较新版本的 JavaMail,则必须应用以下解决方法之一:
reset
以设置和恢复上下文类加载器(如果上下文类加载器为空)。
ALL
或将容量设置为 1,以便为每个日志记录发送一封电子邮件并收到垃圾邮件。
主要问题是,LogManager$Cleaner
在调用close
每个Handler
在LogManager
. 对于 LogManager 来说,更好的选择是在调用 close 之前将上下文类加载器设置为处理程序类加载器,然后在所有处理程序关闭后将上下文类加载器设置为 null。这仍然可能被嵌套处理程序愚弄,但至少它可以修复常见情况。这被归档为 RFE JDK-8025251 “LogManager Cleaner 应在关闭期间使用处理程序类加载器”。