Grails log4j SMTPAppender NoClassDefFoundError

标签 grails dependency-management

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

| Error log4j:ERROR Error initializing log4j: javax/mail/Message

| Error 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

最佳答案

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

我在您收到的错误中找到的解释

Error log4j:ERROR Error initializing log4j: javax/mail/Message

Error java.lang.NoClassDefFoundError: javax/mail/Message



来自这段代码:
dependencies {
    provided 'javax.mail:mail:1.4.7'
}

问题是,当你编译东西时,当你尝试做时 grails run-app您收到此错误。

我发现的解释是 log4j 在 maven 依赖项解决之前初始化。

我写了一篇关于我如何使用 Sentry 作为 appender 的评论。
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 文件夹中。

我希望它有帮助!

关于Grails log4j SMTPAppender NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30549099/

相关文章:

grails - Groovy,Grails;每周为变量添加+1

json - 使用条件运算符在 Grails 中渲染 'as JSON' 无法正确渲染

跟踪缓存变量/函数依赖关系的 Pythonic 方法

python - 有没有像 python 的通用依赖解析库这样的东西?

npm - 如何让 npm 使用符合所有要求的最低版本

grails 服务层次结构

spring - 将更改保存到Grails中的属性文件

gradle - Gradle中的选择性依赖

ios - 如何使用 Typhoon 为集成测试注入(inject)假的、 stub 的或模拟的依赖项

grails - UrlMappings.groovy带参数的默认 View