Skip to main content

[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





Back to the top