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