[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[jetty-users] Reloading gerrit webapp context fails - classloading problem
|
Hi,
I'm running gerrit as an webapp under jetty with the following
gerrit.xml file in jetty-base/webapps directory:
<Configure id="wacGerrit" class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/gerrit</Set>
<Set name="war">C:\Users\thomas\jetty-base\war\gerrit-2.11.3.war</Set>
<New id="datasourceGerrit" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg><Ref id="wacGerrit"/></Arg>
<Arg>jdbc/ReviewDb</Arg>
<Arg>
<New class="org.h2.jdbcx.JdbcDataSource">
<Set name="url">jdbc:h2:file:gerrit/db/ReviewDB</Set>
</New>
</Arg>
</New>
<Set name="securityHandler">
<New class="org.eclipse.jetty.security.ConstraintSecurityHandler">
<Set name="loginService">
<New class="org.eclipse.jetty.security.HashLoginService">
<Set name="name">GerritRealm</Set>
<Set name="config"><SystemProperty name="jetty.base"
default="."/>/etc/login-GerritRealm.properties</Set>
</New>
</Set>
</New>
</Set>
</Configure>
I did put the h2-1.3.176.jar in jetty-base/lib/ext.
When I start jetty freshly the class org.h2.jdbcx.JdbcDataSource is
loaded from classloader "Classpath$Loader" (the "lib/ext classloader")
Stack trace is:
Thread [main] (Suspended)
owns: Scanner (id=53)
owns: Object (id=54)
owns: Object (id=55)
owns: Object (id=56)
owns: Object (id=57)
Class<T>.getConstructors() line: not available [local variables unavailable]
TypeUtil.construct(Class<?>, Object[]) line: 557
XmlConfiguration$JettyXmlConfiguration.newObj(Object, XmlParser$Node)
line: 787
XmlConfiguration$JettyXmlConfiguration.itemValue(Object, Object) line: 1233
XmlConfiguration$JettyXmlConfiguration.value(Object, XmlParser$Node)
line: 1138
XmlConfiguration$JettyXmlConfiguration.newObj(Object, XmlParser$Node)
line: 766
XmlConfiguration$JettyXmlConfiguration.configure(Object,
XmlParser$Node, int) line: 423
XmlConfiguration$JettyXmlConfiguration.configure() line: 358
WebAppProvider$1(XmlConfiguration).configure() line: 259
WebAppProvider.createContextHandler(App) line: 285
App.getContextHandler() line: 105
StandardDeployer.processBinding(Node, App) line: 36
AppLifeCycle.runBindings(Node, App, DeploymentManager) line: 188
DeploymentManager.requestAppGoal(DeploymentManager$AppEntry, String)
line: 499
DeploymentManager.addApp(App) line: 147
WebAppProvider(ScanningAppProvider).fileAdded(String) line: 180
WebAppProvider.fileAdded(String) line: 459
ScanningAppProvider$1.fileAdded(String) line: 64
Scanner.reportAddition(String) line: 610
Scanner.reportDifferences(Map<String,TimeNSize>,
Map<String,TimeNSize>) line: 529
Scanner.scan() line: 392
Scanner.doStart() line: 313
Scanner(AbstractLifeCycle).start() line: 68
WebAppProvider(ScanningAppProvider).doStart() line: 150
WebAppProvider(AbstractLifeCycle).start() line: 68
DeploymentManager.startAppProvider(AppProvider) line: 561
DeploymentManager.doStart() line: 236
DeploymentManager(AbstractLifeCycle).start() line: 68
Server(ContainerLifeCycle).start(LifeCycle) line: 132
Server.start(LifeCycle) line: 405
Server(ContainerLifeCycle).doStart() line: 114
Server(AbstractHandler).doStart() line: 61
Server.doStart() line: 372
Server(AbstractLifeCycle).start() line: 68
XmlConfiguration$1.run() line: 1510
AccessController.doPrivileged(PrivilegedAction<T>) line: not
available [native method]
XmlConfiguration.main(String...) line: 1435
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not
available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: not available
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: not available
Method.invoke(Object, Object...) line: not available
Main.invokeMain(ClassLoader, StartArgs) line: 214
Main.start(StartArgs) line: 457
Main.main(String[]) line: 75
When I restart the webapp context via jconsole JMX I get an exception:
java.lang.NoSuchMethodException: class
org.h2.jdbcx.JdbcDataSource.setUrl(class java.lang.String)
at
org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.set(XmlConfiguration.java:591)
at
org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:411)
at
org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.newObj(XmlConfiguration.java:799)
at
org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.itemValue(XmlConfiguration.java:1233)
at
org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.value(XmlConfiguration.java:1138)
at
org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.newObj(XmlConfiguration.java:766)
at
org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:423)
at
org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:358)
at
org.eclipse.jetty.xml.XmlConfiguration.configure(XmlConfiguration.java:259)
at
org.eclipse.jetty.deploy.providers.WebAppProvider.createContextHandler(WebAppProvider.java:285)
at org.eclipse.jetty.deploy.App.getContextHandler(App.java:105)
at
org.eclipse.jetty.deploy.bindings.StandardDeployer.processBinding(StandardDeployer.java:36)
at org.eclipse.jetty.deploy.AppLifeCycle.runBindings(AppLifeCycle.java:188)
at
org.eclipse.jetty.deploy.DeploymentManager.requestAppGoal(DeploymentManager.java:499)
at
org.eclipse.jetty.deploy.DeploymentManager.addApp(DeploymentManager.java:147)
at
org.eclipse.jetty.deploy.providers.ScanningAppProvider.fileChanged(ScanningAppProvider.java:198)
at
org.eclipse.jetty.deploy.providers.WebAppProvider.fileChanged(WebAppProvider.java:416)
at
org.eclipse.jetty.deploy.providers.ScanningAppProvider$1.fileChanged(ScanningAppProvider.java:70)
at org.eclipse.jetty.util.Scanner.reportChange(Scanner.java:664)
at org.eclipse.jetty.util.Scanner.reportDifferences(Scanner.java:532)
at org.eclipse.jetty.util.Scanner.scan(Scanner.java:392)
at org.eclipse.jetty.util.Scanner$1.run(Scanner.java:329)
at java.util.TimerThread.mainLoop(Unknown Source)
at java.util.TimerThread.run(Unknown Source)
Because the class org.h2.jdbcx.JdbcDataSource is loaded from the
WebAppClassLoader.
Stack trace is:
Daemon Thread [Scanner-0] (Suspended (breakpoint at line 591 in
XmlConfiguration$JettyXmlConfiguration))
owns: Scanner (id=53)
XmlConfiguration$JettyXmlConfiguration.set(Object, XmlParser$Node) line: 591
XmlConfiguration$JettyXmlConfiguration.configure(Object,
XmlParser$Node, int) line: 411
XmlConfiguration$JettyXmlConfiguration.newObj(Object, XmlParser$Node)
line: 799
XmlConfiguration$JettyXmlConfiguration.itemValue(Object, Object) line: 1233
XmlConfiguration$JettyXmlConfiguration.value(Object, XmlParser$Node)
line: 1138
XmlConfiguration$JettyXmlConfiguration.newObj(Object, XmlParser$Node)
line: 766
XmlConfiguration$JettyXmlConfiguration.configure(Object,
XmlParser$Node, int) line: 423
XmlConfiguration$JettyXmlConfiguration.configure() line: 358
WebAppProvider$1(XmlConfiguration).configure() line: 259
WebAppProvider.createContextHandler(App) line: 285
App.getContextHandler() line: 105
StandardDeployer.processBinding(Node, App) line: 36
AppLifeCycle.runBindings(Node, App, DeploymentManager) line: 188
DeploymentManager.requestAppGoal(DeploymentManager$AppEntry, String)
line: 499
DeploymentManager.addApp(App) line: 147
WebAppProvider(ScanningAppProvider).fileChanged(String) line: 198
WebAppProvider.fileChanged(String) line: 416
ScanningAppProvider$1.fileChanged(String) line: 70
Scanner.reportChange(String) line: 664
Scanner.reportDifferences(Map<String,TimeNSize>,
Map<String,TimeNSize>) line: 532
Scanner.scan() line: 392
Scanner$1.run() line: 329
TimerThread.mainLoop() line: not available
TimerThread.run() line: not available
looking into gerrit.war file it contains also the h2 jar file, version
1.3.174 (I did put 1.3.176 in lib/ext...) in WEB-INF/lib.
So I wonder why the restart of the webapp context doesn't work?
Shouldn't the restart also take the JNDI binding from the lib/ext classloader?
Bug or feature? Any idea how to fix this?
Jetty version is:
2015-10-03 21:50:54.303:INFO:oejs.Server:main: jetty-9.3.3.v20150827