首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Grails log4j SMTPAppender NoClassDefFoundError

Grails log4j SMTPAppender NoClassDefFoundError
EN

Stack Overflow用户
提问于 2015-05-30 17:17:51
回答 2查看 539关注 0票数 5

如何在新的Grails2.4.5项目中配置SMTPAppender?在开发环境中运行时,我会收到一个NoClassDefFoundError:

错误初始化log4j: javax/mail/Message 错误java.lang.NoClassDefFoundError: javax/mail/Message

Gist:详细的堆栈跟踪

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

代码语言:javascript
复制
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:示例项目

EN

回答 2

Stack Overflow用户

发布于 2016-11-09 18:18:21

我知道这篇文章很老了,但我一直在挣扎,直到我找到了一个至少为我工作的解决方案(不是用SMTPAppender,而是用Sentry --同样的目的)。

我从你收到的错误中找到的解释

错误日志4j:错误初始化log4j: javax/mail/Message 错误java.lang.NoClassDefFoundError: javax/mail/Message

来自这段代码:

代码语言:javascript
复制
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 por示例,我将SentryAppender.java添加到my.package.sentry中,然后在log4j中添加:

代码语言:javascript
复制
  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文件夹中。

希望能帮上忙!

票数 2
EN

Stack Overflow用户

发布于 2015-05-31 01:34:11

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30549099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档