Hi,
I'm having problems with deployment/undeployment of Wicket apps on
Tomcat (and also JBoss, though I think it's related to the fact that it
embeds Tomcat). Basically, in both cases undeployment comes back with an
Exception, leaving the server in a "dirty" state and I have to restart
the server every time. This has been mentioned in both the user and
developer lists, but with no reply:
http://old.nabble.com/java.lang.NoClassDefFoundError:-org-apache-wicket-util-lang-PropertyResolver-tc26191924.html
http://old.nabble.com/Weird-error-on-shutdown...-td18907685.html
The problem manifests only when deploying EXPLODED wars (with a single
packaged WAR file, the problem goes away). It can be easily reproduced
as follows:
1) Create an instance of the quickstart archetype
(http://wicket.apache.org/quickstart.html). Let's say you used the
default values so the artifact id is "myproject" from here on. Use the
latest 1.4.7 version of Wicket (though I've tried with all previous
versions up to 1.4.4 and the result is the same; the reference above
uses version 1.4-m2, so it must be surprisingly old).
2) Create an EXPLODED web archive (war) with "mvn war:exploded"
3) Move the exploded war folder (myproject-1.0-SNAPSHOT) to the
deployment folder ("server/xxx/deploy" for JBoss or "webapps")
4) Undeploy by moving the exploded war folder (myproject-1.0-SNAPSHOT),
OUT of the deployment folder
You will get a stack trace that basically ends up in a ClassNotFound
exception when the Wicket filter is cleaning up:
java.lang.NoClassDefFoundError: org/apache/wicket/util/lang/PropertyResolver
at org.apache.wicket.Application.internalDestroy(Application.java:952)
at
org.apache.wicket.protocol.http.WebApplication.internalDestroy(WebApplication.java:527)
at
org.apache.wicket.protocol.http.WicketFilter.destroy(WicketFilter.java:179)
at
org.apache.catalina.core.ApplicationFilterConfig.release(ApplicationFilterConfig.java:267)
....
This is a huge annoyance, because re-deployment of the application does
not work; if you try to deploy it again, JBoss fails with:
org.jboss.deployers.spi.DeploymentException: Web mapping already exists
for deployment URL
file:/F:/ade_ws/.metadata/.plugins/org.jboss.ide.eclipse.as.core/JBoss_5.1_(default)/deploy/myproject-1.0-SNAPSHOT/
at
org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeployInternal(TomcatDeployment.java:187)
Basically, you must restart the entire JBoss server. In a production
environment it means you can't upgrade your wicket applications without
affecting other applications (though you can get away if you don't use
an exploded WAR folder). In a developer environment it's totally
counter-productive: you need the exploded format and restaring JBoss
every time is quite irritating. The Eclipse WTP adapter runs in
"exploded" mode which basically makes working with Eclipse a nightmare.
I am using JDK1.6 (I use 1.6.0_18) and either JBoss5.1 or Tomcat 6.0.26
(or 6.0.18 or 5.5.28 which I also tried). My system is running Windows 7
and NTFS (it may be relevant to the way the file-system handles moving
folders).
Last notes:
1) I had a look at the code. It seems that Wicket tries to use weak
references to facilitate a thorough clean-up of the JVM by garbage
collection after the application is undeployed. This may be related, as
it appears to me as if the class loader used by the application is no
longer available during clean-up. I think there's some class-loading
magic going on, probably the thread's context class loader is being
switched, which ends up in the destroy() method not having access to wicket.
2) Jetty does not seem to have any problems, so it must be something in
the way Tomcat works.
3) The complete stack trace in my case (Win7, JDK1.6.0_18-win32,
JBoss5.1, Wicket1.4.7) is:
java.lang.NoClassDefFoundError: org/apache/wicket/util/lang/PropertyResolver
at org.apache.wicket.Application.internalDestroy(Application.java:952)
at
org.apache.wicket.protocol.http.WebApplication.internalDestroy(WebApplication.java:527)
at
org.apache.wicket.protocol.http.WicketFilter.destroy(WicketFilter.java:179)
at
org.apache.catalina.core.ApplicationFilterConfig.release(ApplicationFilterConfig.java:267)
at
org.apache.catalina.core.StandardContext.filterStop(StandardContext.java:3818)
at
org.apache.catalina.core.StandardContext.stop(StandardContext.java:4605)
at
org.apache.catalina.core.ContainerBase.destroy(ContainerBase.java:1175)
at
org.apache.catalina.core.StandardContext.destroy(StandardContext.java:4705)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:297)
at
org.jboss.mx.server.RawDynamicInvoker.invoke(RawDynamicInvoker.java:164)
at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668)
at
org.jboss.web.tomcat.service.deployers.TomcatDeployment.performUndeployInternal(TomcatDeployment.java:596)
at
org.jboss.web.tomcat.service.deployers.TomcatDeployment.performUndeploy(TomcatDeployment.java:570)
at
org.jboss.web.deployers.AbstractWarDeployment.stop(AbstractWarDeployment.java:480)
at org.jboss.web.deployers.WebModule.stopModule(WebModule.java:133)
at org.jboss.web.deployers.WebModule.stop(WebModule.java:102)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157)
at org.jboss.mx.server.Invocation.dispatch(Invocation.java:96)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
at
org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668)
at
org.jboss.system.microcontainer.ServiceProxy.invoke(ServiceProxy.java:206)
at $Proxy38.stop(Unknown Source)
at
org.jboss.system.microcontainer.StartStopLifecycleAction.uninstallAction(StartStopLifecycleAction.java:56)
at
org.jboss.system.microcontainer.StartStopLifecycleAction.uninstallAction(StartStopLifecycleAction.java:37)
at
org.jboss.dependency.plugins.action.SimpleControllerContextAction.simpleUninstallAction(SimpleControllerContextAction.java:79)
at
org.jboss.dependency.plugins.action.AccessControllerContextAction.uninstall(AccessControllerContextAction.java:131)
at
org.jboss.dependency.plugins.AbstractControllerContextActions.uninstall(AbstractControllerContextActions.java:58)
at
org.jboss.dependency.plugins.AbstractControllerContext.uninstall(AbstractControllerContext.java:354)
at
org.jboss.dependency.plugins.AbstractController.uninstall(AbstractController.java:1664)
at
org.jboss.dependency.plugins.AbstractController.uninstallContext(AbstractController.java:1275)
at
org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:827)
at
org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
at
org.jboss.system.ServiceController.doChange(ServiceController.java:688)
at org.jboss.system.ServiceController.stop(ServiceController.java:510)
at
org.jboss.system.deployers.ServiceDeployer.stop(ServiceDeployer.java:170)
at
org.jboss.system.deployers.ServiceDeployer.undeploy(ServiceDeployer.java:150)
at
org.jboss.system.deployers.ServiceDeployer.undeploy(ServiceDeployer.java:46)
at
org.jboss.deployers.spi.deployer.helpers.AbstractSimpleRealDeployer.internalUndeploy(AbstractSimpleRealDeployer.java:69)
at
org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer.undeploy(AbstractRealDeployer.java:112)
at
org.jboss.deployers.plugins.deployers.DeployerWrapper.undeploy(DeployerWrapper.java:196)
at
org.jboss.deployers.plugins.deployers.DeployersImpl.doUndeploy(DeployersImpl.java:1469)
at
org.jboss.deployers.plugins.deployers.DeployersImpl.doUninstallParentLast(DeployersImpl.java:1376)
at
org.jboss.deployers.plugins.deployers.DeployersImpl.doUninstallParentLast(DeployersImpl.java:1369)
at
org.jboss.deployers.plugins.deployers.DeployersImpl.uninstall(DeployersImpl.java:1331)
at
org.jboss.dependency.plugins.AbstractControllerContext.uninstall(AbstractControllerContext.java:354)
at
org.jboss.dependency.plugins.AbstractController.uninstall(AbstractController.java:1664)
at
org.jboss.dependency.plugins.AbstractController.uninstallContext(AbstractController.java:1275)
at
org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:827)
at
org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
at
org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:694)
at
org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:679)
at
org.jboss.system.server.profileservice.repository.MainDeployerAdapter.process(MainDeployerAdapter.java:117)
at
org.jboss.system.server.profileservice.hotdeploy.HDScanner.scan(HDScanner.java:362)
at
org.jboss.system.server.profileservice.hotdeploy.HDScanner.run(HDScanner.java:255)
at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at
java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:181)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:205)
at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org