Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails log4j SMTPAppender NoClassDefFounder错误_Grails_Dependency Management - Fatal编程技术网

Grails log4j SMTPAppender NoClassDefFounder错误

Grails log4j SMTPAppender NoClassDefFounder错误,grails,dependency-management,Grails,Dependency Management,如何在新的Grails2.4.5项目中配置SMTPAppender?在开发环境中运行时,我收到NoClassDefFoundError: |错误log4j:初始化log4j:javax/mail/Message时出错 |错误java.lang.NoClassDefFoundError:javax/mail/Message 我已经为javax.mail配置了一个依赖项,并按照如下方式配置了log4j: dependencies { provided 'javax.mail:mail:1.

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

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

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

我已经为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')
        )
    }
}

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


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

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

我发现的关于你收到的错误的解释

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

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

来自这段代码:

dependencies {
    provided 'javax.mail:mail:1.4.7'
}
问题是,当您编译东西时,当您尝试执行
grailsrunapp
时,您会收到此错误

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

我写了一篇评论,说我是如何利用哨兵作为附属者的。

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

因此,对于Sentry por示例,我将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文件夹中


我希望它能有所帮助!

log4j={是一个转录错误。这些设置是从一个较旧的工作项目复制的。我用OpenJDK 1.7.079和Oracle JDK 1.8.045进行了测试。我添加了一个链接,指向一个显示此问题的干净示例。我下载了你的GitHub应用程序,并按照我在回答中的建议进行了测试(我注释掉了
appender
root
块,然后对它们进行编译,然后取消注释并再次编译),效果很好。我只是使用IDEA 14.1.3并从终端直接使用grails CLI再次执行了该过程,得到了完全相同的错误。在grails 2.4.5中,它应该是
log4j.main={
。在早期版本中它曾经是
log4j={
。也许这仍然有效,但至少
grails create app
现在生成
log4j.main={
有人找到了解决方案吗?