我在Java程序中用到了Log4j,开始只是在控制台和文件中输出Log,现在要加上Log4j发邮件的功能,但是当我在log4j.properties文件中加入MAIL的配制时,一运行到PropertyConfigurator.configure("log4j.properties");就报错,把MAIL部分去掉就正常,请大家帮帮忙,谢谢。
以下是log4j.properties文件中MAIL部分log4j.rootLogger=INFO,A1,A2,MAIL
……
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=ERROR
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.SMTPHost=smtp.……
log4j.appender.MAIL.SMTPDebug=true
log4j.appender.MAIL.Subject=Log4JErrorMessage
log4j.appender.MAIL.SMTPUsername=……
log4j.appender.MAIL.SMTPPassword=……
log4j.appender.MAIL.From=……
log4j.appender.MAIL.To=……
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[%5p] %d [%t] (%F:%L) - %m%n

解决方案 »

  1.   

    1.报错信息如下:
    Exception in thread "main" java.lang.NoClassDefFoundError: javax/mail/internet/AddressException
    at java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
    at java.lang.Class.getConstructor0(Class.java:2699)
    at java.lang.Class.newInstance0(Class.java:326)
    at java.lang.Class.newInstance(Class.java:308)
    at org.apache.log4j.helpers.OptionConverter.instantiateByClassName(OptionConverter.java:330)
    at org.apache.log4j.helpers.OptionConverter.instantiateByKey(OptionConverter.java:121)
    at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:664)
    at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:647)
    at org.apache.log4j.PropertyConfigurator.configureRootCategory(PropertyConfigurator.java:544)
    at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:440)
    at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:334)
    at org.apache.log4j.PropertyConfigurator.configure(PropertyConfigurator.java:342)
    at test.Log4jTestMain.<init>(Log4jTestMain.java:11)
    at test.Log4jTestMain.main(Log4jTestMain.java:15)
    Caused by: java.lang.ClassNotFoundException: javax.mail.internet.AddressException
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
    ... 15 more2.去掉的部分已经贴出来了,就是上面的log4j.properties中的MAIL部分。
      

  2.   

    没配置过邮件的log  up   !
      

  3.   

    为啥会提示找不到javax.mail.internet.AddressException这个类呢,邮件没配置过,不明白
      

  4.   

    to defonds:
    谢谢,请问缺哪个包?
    javax.mail.internet.AddressException在mail.jar中有。下面是build path中加入的包:
    commons-codec-1.3.jar
    commons-httpclient-3.1.jar
    commons-logging-1.1.1.jar
    jakarta-oro-2.0.8.jar
    activation.jar
    log4j-1.2.15.jar
    mail.jar
      

  5.   


    java.lang.NoClassDefFoundError提示类找不到
      

  6.   

    请问是什么意思,谢谢!
    请问用log4j发邮件,还需要什么jar包吗?谢谢!
      

  7.   

    jar包没有导入。或者jar版本问题。
      

  8.   

    已经解决了,我把mail.jar文件放到jre的lib/ext目录下,就好了。可是,为什么我在classpath中配置了mail.jar却不行?
    在classpath下配置和放在jre中有什么区别吗?
      

  9.   

    在classpath下配置和放在jre中只是配置方式不同,其本质和目的是一样的。应该都好用。
    只有一种解释,你classpath下配置的不对,小问题你没发现。正常有 eclipse直接把JAR包导入类路径就行。无论你有哪种方式,都是把要用的JAR包导入到类路径中,与类一起编译运行。
      

  10.   

    是的。可能你的log4j不仅仅在本工程用到
      

  11.   

    这个异常是由于需要抛出AddressException导致,或者说是由于你的地址配置不对,导致需要找这个类,如果你后来改对地址,不抛这个错,也就不会加载该类,也就不能确定是由于“把mail.jar文件放到jre的lib/ext目录下”同时希望能告知你的启动方式,因为加入真是由于“把mail.jar文件放到jre的lib/ext目录下”,解决了你的问题,那就和你的运行环境有关
    说实在的如果配在classpath下,除非是包地址不对,或则包的导入顺序有问题,否则不会出现你的问题
      

  12.   

    谢谢大家的帮助,我总结了一下:
    1.我直接用Eclipse导入mail.jar时,可以用Java调用mail.jar发邮件;
    2.log4j.properties中没有加入mail部分时,是正常的;所以,我想是不是log4j.properties加入mail后,需要mail.jar,而且配置文件是不是要到CLASSPATH中去找jar包,而我只是在Eclipse中加了mail.jar,而没有在CLASSPATH中加,所以就找不到。不知道我分析的是否正确?如果是这样,是不是只能在CLASSPATH中加mail.jar了,能不能放在工程中呢?
    谢谢!
      

  13.   

    缺类一定是少包,要这两个包,看你有没有:
    activation.jar
    mail.jar
      

  14.   

    请问如何让log4j.properties去工程中找所用到的jar包,而不是是系统的CLASSPATH中找?
    谢谢!
      

  15.   

    如果从Eclipse启动Java项目,那么Eclipse会查找当前项目的“.classpath”文件,其中配置了当前项目依赖的jar包和其它的运行环境配置,并根据文件拼出JVM所需的运行环境,也就是java.exe的CLASSPATH参数。
    我觉得你是用Eclipse开发项目,却用命令行启动应用,如果是这样,那就有点。
      

  16.   

    to hsf_1982:
    谢谢!
    开发的时候当然是用Eclipse启动了。