[
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