[prev in list] [next in list] [prev in thread] [next in thread] 

List:       geronimo-user
Subject:    NoClassDefFoundError trying to use log4j SMTPAppender
From:       Kevan Miller <kevan.miller () gmail ! com>
Date:       2012-03-02 15:02:21
Message-ID: 454B3C51-7FC6-4353-BDC6-F99A41D32D8B () gmail ! com
[Download RAW message or body]

On IRC, yesterday, a user reported a problem deploying their app on =
Geronimo 2.2.1. They had an exception like the following:

ERROR Servlet /analytics threw load() exception
org.springframework.beans.PropertyBatchUpdateException; nested =
PropertyAccessException details (1) are:
PropertyAccessException 1:
org.springframework.beans.MethodInvocationException: Property =
'accountService' threw exception; nested exception is =
java.lang.NoClassDefFoundError: javax/mail/Multipart
	at =
org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl=
.java:1119)
	at =
org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl=
.java:899)
	at =
org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(Abstr=
actPropertyAccessor.java:76)
	at =
org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(Abstr=
actPropertyAccessor.java:58)
	at =
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFacto=
ry.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1350)
	at =
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFacto=
ry.populateBean(AbstractAutowireCapableBeanFactory.java:1076)
	at =
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFacto=
ry.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
	at =
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFacto=
ry.createBean(AbstractAutowireCapableBeanFactory.java:456)
	at =
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(=
AbstractBeanFactory.java:291)
	at =
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.get=
Singleton(DefaultSingletonBeanRegistry.java:222)
	at =
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(Ab=
stractBeanFactory.java:288)
	at =
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(Abst=
ractBeanFactory.java:190)
	at =
org.springframework.context.support.AbstractApplicationContext.getBean(Abs=
tractApplicationContext.java:1075)
	at =
org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.register=
Handler(AbstractUrlHandlerMapping.java:383)
	at =
org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.register=
Handler(AbstractUrlHandlerMapping.java:362)
	at =
org.springframework.web.servlet.handler.AbstractDetectingUrlHandlerMapping=
.detectHandlers(AbstractDetectingUrlHandlerMapping.java:82)
	at =
org.springframework.web.servlet.handler.AbstractDetectingUrlHandlerMapping=
.initApplicationContext(AbstractDetectingUrlHandlerMapping.java:58)
	at =
org.springframework.context.support.ApplicationObjectSupport.initApplicati=
onContext(ApplicationObjectSupport.java:119)
	at =
org.springframework.web.context.support.WebApplicationObjectSupport.initAp=
plicationContext(WebApplicationObjectSupport.java:72)
	at =
org.springframework.context.support.ApplicationObjectSupport.setApplicatio=
nContext(ApplicationObjectSupport.java:73)
	at =
org.springframework.context.support.ApplicationContextAwareProcessor.invok=
eAwareInterfaces(ApplicationContextAwareProcessor.java:106)
	at =
org.springframework.context.support.ApplicationContextAwareProcessor.postP=
rocessBeforeInitialization(ApplicationContextAwareProcessor.java:85)
	at =
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFacto=
ry.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBean=
Factory.java:394)
	at =
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFacto=
ry.initializeBean(AbstractAutowireCapableBeanFactory.java:1405)
	at =
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFacto=
ry.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
	at =
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFacto=
ry.createBean(AbstractAutowireCapableBeanFactory.java:456)
	at =
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(=
AbstractBeanFactory.java:291)
	at =
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.get=
Singleton(DefaultSingletonBeanRegistry.java:222)
	at =
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(Ab=
stractBeanFactory.java:288)
	at =
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(Abst=
ractBeanFactory.java:194)
	at =
org.springframework.beans.factory.support.DefaultListableBeanFactory.getBe=
ansOfType(DefaultListableBeanFactory.java:398)
	at =
org.springframework.context.support.AbstractApplicationContext.getBeansOfT=
ype(AbstractApplicationContext.java:1146)
	at =
org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAnc=
estors(BeanFactoryUtils.java:266)
	at =
org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAnc=
estors(BeanFactoryUtils.java:270)
	at =
org.springframework.web.servlet.DispatcherServlet.initHandlerMappings(Disp=
atcherServlet.java:424)
	at =
org.springframework.web.servlet.DispatcherServlet.initStrategies(Dispatche=
rServlet.java:339)
	at =
org.springframework.web.servlet.DispatcherServlet.onRefresh(DispatcherServ=
let.java:328)
	at =
org.springframework.web.servlet.FrameworkServlet.onApplicationEvent(Framew=
orkServlet.java:523)
	at =
org.springframework.web.servlet.FrameworkServlet$ContextRefreshListener.on=
ApplicationEvent(FrameworkServlet.java:749)
	at =
org.springframework.web.servlet.FrameworkServlet$ContextRefreshListener.on=
ApplicationEvent(FrameworkServlet.java:1)
	at =
org.springframework.context.event.GenericApplicationListenerAdapter.onAppl=
icationEvent(GenericApplicationListenerAdapter.java:51)
	at =
org.springframework.context.event.SourceFilteringListener.onApplicationEve=
ntInternal(SourceFilteringListener.java:97)
	at =
org.springframework.context.event.SourceFilteringListener.onApplicationEve=
nt(SourceFilteringListener.java:68)
	at =
org.springframework.context.event.SimpleApplicationEventMulticaster.multic=
astEvent(SimpleApplicationEventMulticaster.java:97)
	at =
org.springframework.context.support.AbstractApplicationContext.publishEven=
t(AbstractApplicationContext.java:303)
	at =
org.springframework.context.support.AbstractApplicationContext.finishRefre=
sh(AbstractApplicationContext.java:911)
	at =
org.springframework.context.support.AbstractApplicationContext.refresh(Abs=
tractApplicationContext.java:428)
	at =
org.springframework.web.servlet.FrameworkServlet.createWebApplicationConte=
xt(FrameworkServlet.java:442)
	at =
org.springframework.web.servlet.FrameworkServlet.createWebApplicationConte=
xt(FrameworkServlet.java:458)
	at =
org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext=
(FrameworkServlet.java:339)
	at =
org.springframework.web.servlet.FrameworkServlet.initServletBean(Framework=
Servlet.java:306)
	at =
org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:=
127)
	at javax.servlet.GenericServlet.init(GenericServlet.java:215)
	at =
org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:=
1065)
	at =
org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:967)
	at =
org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.jav=
a:4343)
	at =
org.apache.catalina.core.StandardContext.start(StandardContext.java:4649)
	at =
org.apache.geronimo.tomcat.GeronimoStandardContext.access$201(GeronimoStan=
dardContext.java:64)
	at =
org.apache.geronimo.tomcat.GeronimoStandardContext$SystemMethodValve.invok=
e(GeronimoStandardContext.java:412)
	at =
org.apache.geronimo.tomcat.valve.GeronimoBeforeAfterValve.invoke(GeronimoB=
eforeAfterValve.java:47)
	at =
org.apache.geronimo.tomcat.GeronimoStandardContext.start(GeronimoStandardC=
ontext.java:264)
	at =
org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java=
:791)
	at =
org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
	at =
org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546)
	at =
org.apache.geronimo.tomcat.TomcatContainer.addContext(TomcatContainer.java=
:339)
	at =
org.apache.geronimo.tomcat.TomcatWebAppContext.doStart(TomcatWebAppContext=
.java:525)
	at =
org.apache.geronimo.gbean.runtime.GBeanInstance.createInstance(GBeanInstan=
ce.java:953)
	at =
org.apache.geronimo.gbean.runtime.GBeanInstanceState.attemptFullStart(GBea=
nInstanceState.java:269)
	at =
org.apache.geronimo.gbean.runtime.GBeanInstanceState.start(GBeanInstanceSt=
ate.java:103)
	at =
org.apache.geronimo.gbean.runtime.GBeanInstance.start(GBeanInstance.java:5=
25)
	at =
org.apache.geronimo.gbean.runtime.GBeanDependency.attemptFullStart(GBeanDe=
pendency.java:110)
	at =
org.apache.geronimo.gbean.runtime.GBeanDependency.addTarget(GBeanDependenc=
y.java:145)
	at =
org.apache.geronimo.gbean.runtime.GBeanDependency$1.running(GBeanDependenc=
y.java:119)
	at =
org.apache.geronimo.kernel.basic.BasicLifecycleMonitor.fireRunningEvent(Ba=
sicLifecycleMonitor.java:175)
	at =
org.apache.geronimo.kernel.basic.BasicLifecycleMonitor.access$300(BasicLif=
ecycleMonitor.java:44)
	at =
org.apache.geronimo.kernel.basic.BasicLifecycleMonitor$RawLifecycleBroadca=
ster.fireRunningEvent(BasicLifecycleMonitor.java:253)
	at =
org.apache.geronimo.gbean.runtime.GBeanInstanceState.attemptFullStart(GBea=
nInstanceState.java:295)
	at =
org.apache.geronimo.gbean.runtime.GBeanInstanceState.start(GBeanInstanceSt=
ate.java:103)
	at =
org.apache.geronimo.gbean.runtime.GBeanInstanceState.startRecursive(GBeanI=
nstanceState.java:125)
	at =
org.apache.geronimo.gbean.runtime.GBeanInstance.startRecursive(GBeanInstan=
ce.java:539)
	at =
org.apache.geronimo.kernel.basic.BasicKernel.startRecursiveGBean(BasicKern=
el.java:377)
	at =
org.apache.geronimo.kernel.config.ConfigurationUtil.startConfigurationGBea=
ns(ConfigurationUtil.java:456)
	at =
org.apache.geronimo.kernel.config.KernelConfigurationManager.start(KernelC=
onfigurationManager.java:190)
	at =
org.apache.geronimo.kernel.config.SimpleConfigurationManager.startConfigur=
ation(SimpleConfigurationManager.java:546)
	at sun.reflect.GeneratedMethodAccessor22.invoke(Unknown Source)
	at =
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorIm=
pl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at =
org.apache.geronimo.gbean.runtime.ReflectionMethodInvoker.invoke(Reflectio=
nMethodInvoker.java:34)
	at =
org.apache.geronimo.gbean.runtime.GBeanOperation.invoke(GBeanOperation.jav=
a:130)
	at =
org.apache.geronimo.gbean.runtime.GBeanInstance.invoke(GBeanInstance.java:=
816)
	at =
org.apache.geronimo.gbean.runtime.RawInvoker.invoke(RawInvoker.java:57)
	at =
org.apache.geronimo.kernel.basic.RawOperationInvoker.invoke(RawOperationIn=
voker.java:35)
	at =
org.apache.geronimo.kernel.basic.ProxyMethodInterceptor.intercept(ProxyMet=
hodInterceptor.java:96)
	at =
org.apache.geronimo.gbean.GBeanLifecycle$$EnhancerByCGLIB$$badafacb.startC=
onfiguration(<generated>)
	at =
org.apache.geronimo.system.main.EmbeddedDaemon.doStartup(EmbeddedDaemon.ja=
va:204)
	at =
org.apache.geronimo.system.main.EmbeddedDaemon.execute(EmbeddedDaemon.java=
:87)
	at =
org.apache.geronimo.kernel.util.MainConfigurationBootstrapper.main(MainCon=
figurationBootstrapper.java:45)
	at =
org.apache.geronimo.cli.AbstractCLI.executeMain(AbstractCLI.java:65)
	at =
org.apache.geronimo.cli.daemon.DaemonCLI.main(DaemonCLI.java:30)
Caused by: java.lang.NoClassDefFoundError: javax/mail/Multipart
	at =
com.vistracks.tracking.web.controller.AccountController.setAccountService(=
AccountController.java:48)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at =
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:=
39)
	at =
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorIm=
pl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at =
org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl=
.java:1106)
	... 98 more
Caused by: java.lang.ClassNotFoundException: javax.mail.Multipart
	at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
	... 104 more

The problem was caused by their use of org.apache.log4j.net.SMTPAppender =
(actually they were using com.tgerm.log4j.appender.GmailSMTPAppender, =
which extends SMTPAppender).

log4j was being loaded from the Geronimo root classloader (log4j is =
packaged in our lib). The root classloader does not include the javamail =
spec api classes. And thus we end up with a confusing =
NoClassDefFoundError.

Their app included log4j. So, adding:

                <dep:hidden-classes>
                        <dep:filter>org.apache.log4j</dep:filter>
                </dep:hidden-classes>

to their deployment plan fixed the problem. If the app didn't include =
log4j, you could add a dependency for the log4j jar in their deployment =
plan=85

You should probably also review docs on application specific logging -- =
https://cwiki.apache.org/GMOxDOC22/configuring-application-specific-loggin=
g-with-log4j.html

--kevan=
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic