How do I configure SMTPAppender in a new Grails 2.4.5 project? I receive a NoClassDefFoundError when running in the development environment:
| Error log4j:ERROR Error initializing log4j: javax/mail/Message
| Error java.lang.NoClassDefFoundError: javax/mail/Message
Gist: Detailed stacktrace
I have configured a dependency for javax.mail and configured log4j as follows:
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: '[email protected]',
            from: '[email protected]',
            subject: 'Grails Message',
            SMTPHost: '127.0.0.1')
        )
    }
}
GitHub: Example Project
I know this post is old, but I struggled with the same till I found a solution that is at least working for me (not with SMTPAppender but with Sentry - same purpose).
The explanation I found with the errors you where receiving
Error log4j:ERROR Error initializing log4j: javax/mail/Message
Error java.lang.NoClassDefFoundError: javax/mail/Message
Come from this piece of code:
dependencies {
    provided 'javax.mail:mail:1.4.7'
}
The thing is that when you compile things work, when you try to do grails run-app you receive this error.
The explanation I found is that the log4j initializes before the maven dependency is resolved.
I wrote a comment of how I've used Sentry as an appender. https://github.com/getsentry/raven-java/issues/184#issuecomment-259432057
Basically, instead of adding the maven dependency I've downloaded the java file, and added it to the grails project in src/java
So for Sentry por example I added the SentryAppender.java to my.package.sentry so then in log4j I added:
  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
  }
in that way, it does not depend on an external dependency.
I guess that you could do something similar to the mail dependency and add the java files to the src folder.
I hope it helps!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With