Grails log4j SMTPAppender NoClassDefFoundError

时间:2015-05-30 17:17:52

标签: grails dependency-management

如何在新的Grails 2.4.5项目中配置SMTPAppender?在开发环境中运行时,我收到NoClassDefFoundError:

  

|错误log4j:ERROR初始化log4j时出错:javax / mail / Message

     

|错误java.lang.NoClassDefFoundError:javax / mail / Message

Gist: Detailed stacktrace

我已经为javax.mail配置了一个依赖项,并按如下方式配置了log4j:

dependencies {
    provided 'javax.mail:mail:1.4.7'
}

log4j = {
    appenders {
        appender new org.apache.log4j.net.SMTPAppender(
            name: 'smtp',
            layout: pattern(conversionPattern: '%d{MM-dd-yyyy HH:mm:ss.SSS} [%t] %c %M %x%n%p: %m%n')
            to: 'example@example.com',
            from: 'example@example.com',
            subject: 'Grails Message',
            SMTPHost: '127.0.0.1')
        )
    }
}

GitHub: Example Project

2 个答案:

答案 0 :(得分:2)

我知道这篇文章已经过时了,但我一直在努力解决这个问题,直到找到一个至少对我有用的解决方案(不是使用SMTPAppender而是使用Sentry - 同样的目的)。

我发现的错误是您收到的错误

  

错误log4j:ERROR初始化log4j时出错:javax / mail / Message

     

错误java.lang.NoClassDefFoundError:javax / mail / Message

来自这段代码:

dependencies {
    provided 'javax.mail:mail:1.4.7'
}

问题在于,当您编译工作时,当您尝试grails run-app时,您会收到此错误。

我发现的解释是log4j在maven依赖关系解析之前初始化。

我写了一篇关于我如何使用Sentry作为追随者的评论。 https://github.com/getsentry/raven-java/issues/184#issuecomment-259432057

基本上,我没有添加maven依赖,而是下载了java文件,并将其添加到src / java中的grails项目

因此,对于Sentry示例,我将SentryAppender.java添加到my.package.sentry,然后在log4j中我添加了:

  appenders {
    environments {
        // This block is set up to use the stock raven SentryAppender in
        // production. Sentry Appender runs into all kinds of
        // class loading weirdness when used in a forked grails environment
        production {
            appender new my.package.sentry.SentryAppender(
                name: 'sentry',
                dsn: 'REDACTED',                
                threshold: org.apache.log4j.Level.WARN
            )
        }

        // Uncomment this block if you need to test sentry
        // in a dev environment
        development {
            appender new my.package.sentry.SentryAppender(
                name: 'sentry',
                dsn: 'REDACTED',                
                threshold: org.apache.log4j.Level.WARN
            )
        }
    }    

  }

  root {
    warn 'stdout', 'sentry'
    error 'stdout', 'sentry'
    additivity = false
  }

以这种方式,它不依赖于外部依赖。

我猜你可以做类似于邮件依赖的事情,并将java文件添加到src文件夹。

我希望它有所帮助!

答案 1 :(得分:1)

这看起来很奇怪 - 您是在意外地将依赖项块和log4j块组合在一起,还是在应用程序中的同一个文件中?依赖项应位于BuildConfig.groovy中,log4j块应位于Config.groovy中。此外,它不应该是log4j {,而应是log4j = {

这可能是一个时间问题。如果在解析Javamail依赖项之前解析Config.groovy,则它将失败。尝试注释掉引用Javamail类的部分并运行grails cleangrails compile。这将解决依赖关系并将该jar添加到类路径中。然后,您可以取消注释该代码并再次运行grails compile