Javamelody 2.1.0 not working

Hi everyone, our XWiki won’t startup with Javamelody 2.1.0.

As of now, Javamelody 1.95.0 is the last working version for me.

Everything in our XWiki is configured according to:

https://www.xwiki.org/xwiki/bin/view/Documentation/AdminGuide/Monitoring

XWiki 15.10.7, Jetty 10.0.20

Any tips or suggestions?

Hello @Pako,

Can you develop a bit on what issue you get when starting up (e.g., logs)?
Can I understand that the only change you did is moving from Javamelody 1.95.0 to Javamelody 2.1.0?
If that’s the case, it’s a major version change and it’s possible the documentation is not valid for Javamelody 2+.

Yes, the only change was moving from Javamelody 1.95.0 to 2.1.0

This is what I got from the logs:

java.lang.NoClassDefFoundError: jakarta/servlet/http/HttpSessionListener
	at java.base/java.lang.ClassLoader.defineClass1(Native Method)
	at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017)
	at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
	at java.base/java.net.URLClassLoader.defineClass(URLClassLoader.java:555)
	at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:458)
	at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:452)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:451)
	at org.eclipse.jetty.webapp.WebAppClassLoader.foundClass(WebAppClassLoader.java:594)
	at org.eclipse.jetty.webapp.WebAppClassLoader.loadAsResource(WebAppClassLoader.java:567)
	at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:502)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
	at org.eclipse.jetty.util.Loader.loadClass(Loader.java:59)
	at org.eclipse.jetty.servlet.BaseHolder.doStart(BaseHolder.java:97)
	at org.eclipse.jetty.servlet.ListenerHolder.doStart(ListenerHolder.java:69)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:93)
	at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:382)
	at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1304)
	at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:901)
	at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:306)
	at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:532)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:93)
	at org.eclipse.jetty.deploy.bindings.StandardStarter.processBinding(StandardStarter.java:40)
	at org.eclipse.jetty.deploy.AppLifeCycle.runBindings(AppLifeCycle.java:183)
	at org.eclipse.jetty.deploy.DeploymentManager.requestAppGoal(DeploymentManager.java:516)
	at org.eclipse.jetty.deploy.DeploymentManager.addApp(DeploymentManager.java:151)
	at org.eclipse.jetty.deploy.providers.ScanningAppProvider.fileAdded(ScanningAppProvider.java:210)
	at org.eclipse.jetty.deploy.providers.WebAppProvider.fileAdded(WebAppProvider.java:442)
	at org.eclipse.jetty.deploy.providers.ScanningAppProvider$1.fileAdded(ScanningAppProvider.java:61)
	at org.eclipse.jetty.util.Scanner$DiscreteListener.pathAdded(Scanner.java:284)
	at org.eclipse.jetty.util.Scanner.reportAddition(Scanner.java:896)
	at org.eclipse.jetty.util.Scanner.reportDifferences(Scanner.java:862)
	at org.eclipse.jetty.util.Scanner.scan(Scanner.java:769)
	at org.eclipse.jetty.util.Scanner.startScanning(Scanner.java:658)
	at org.eclipse.jetty.util.Scanner.doStart(Scanner.java:630)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:93)
	at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:171)
	at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:121)
	at org.eclipse.jetty.deploy.providers.ScanningAppProvider.doStart(ScanningAppProvider.java:182)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:93)
	at org.eclipse.jetty.deploy.DeploymentManager.startAppProvider(DeploymentManager.java:605)
	at org.eclipse.jetty.deploy.DeploymentManager.doStart(DeploymentManager.java:246)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:93)
	at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:171)
	at org.eclipse.jetty.server.Server.start(Server.java:470)
	at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:121)
	at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:89)
	at org.eclipse.jetty.server.Server.doStart(Server.java:415)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:93)
	at org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1919)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.eclipse.jetty.start.Main.invokeMain(Main.java:229)
	at org.eclipse.jetty.start.Main.start(Main.java:528)
	at org.eclipse.jetty.start.Main.main(Main.java:76)
Caused by: 
java.lang.ClassNotFoundException: jakarta.servlet.http.HttpSessionListener
	at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:476)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
	at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:511)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
	at java.base/java.lang.ClassLoader.defineClass1(Native Method)
	at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017)
	at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
	at java.base/java.net.URLClassLoader.defineClass(URLClassLoader.java:555)
	at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:458)
	at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:452)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:451)
	at org.eclipse.jetty.webapp.WebAppClassLoader.foundClass(WebAppClassLoader.java:594)
	at org.eclipse.jetty.webapp.WebAppClassLoader.loadAsResource(WebAppClassLoader.java:567)
	at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:502)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
	at org.eclipse.jetty.util.Loader.loadClass(Loader.java:59)
	at org.eclipse.jetty.servlet.BaseHolder.doStart(BaseHolder.java:97)
	at org.eclipse.jetty.servlet.ListenerHolder.doStart(ListenerHolder.java:69)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:93)
	at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:382)
	at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1304)
	at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:901)
	at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:306)
	at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:532)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:93)
	at org.eclipse.jetty.deploy.bindings.StandardStarter.processBinding(StandardStarter.java:40)
	at org.eclipse.jetty.deploy.AppLifeCycle.runBindings(AppLifeCycle.java:183)
	at org.eclipse.jetty.deploy.DeploymentManager.requestAppGoal(DeploymentManager.java:516)
	at org.eclipse.jetty.deploy.DeploymentManager.addApp(DeploymentManager.java:151)
	at org.eclipse.jetty.deploy.providers.ScanningAppProvider.fileAdded(ScanningAppProvider.java:210)
	at org.eclipse.jetty.deploy.providers.WebAppProvider.fileAdded(WebAppProvider.java:442)
	at org.eclipse.jetty.deploy.providers.ScanningAppProvider$1.fileAdded(ScanningAppProvider.java:61)
	at org.eclipse.jetty.util.Scanner$DiscreteListener.pathAdded(Scanner.java:284)
	at org.eclipse.jetty.util.Scanner.reportAddition(Scanner.java:896)
	at org.eclipse.jetty.util.Scanner.reportDifferences(Scanner.java:862)
	at org.eclipse.jetty.util.Scanner.scan(Scanner.java:769)
	at org.eclipse.jetty.util.Scanner.startScanning(Scanner.java:658)
	at org.eclipse.jetty.util.Scanner.doStart(Scanner.java:630)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:93)
	at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:171)
	at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:121)
	at org.eclipse.jetty.deploy.providers.ScanningAppProvider.doStart(ScanningAppProvider.java:182)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:93)
	at org.eclipse.jetty.deploy.DeploymentManager.startAppProvider(DeploymentManager.java:605)
	at org.eclipse.jetty.deploy.DeploymentManager.doStart(DeploymentManager.java:246)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:93)
	at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:171)
	at org.eclipse.jetty.server.Server.start(Server.java:470)
	at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:121)
	at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:89)
	at org.eclipse.jetty.server.Server.doStart(Server.java:415)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:93)
	at org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1919)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.eclipse.jetty.start.Main.invokeMain(Main.java:229)
	at org.eclipse.jetty.start.Main.start(Main.java:528)
	at org.eclipse.jetty.start.Main.main(Main.java:76)

Sounds like Javamelody moved to Jakarta (or maybe they support both, and you might need to take a deeper look at their documentation). It’s not the case of XWiki yet.

We don’t use Javamelody much anymore (we mainly moved to Glowroot).

We probably need to update https://www.xwiki.org/xwiki/bin/view/Documentation/AdminGuide/Monitoring#HJavaMelody by finding the version after which they moved to jakarta and document that.

I just did a quick test with XWiki 15.10.7

For me the last working version is Javamelody 1.98.0

Breaking change seems to be in 2.0.1

ok thanks, they probably moved to jakarta in 2.0. I’ll update the doc with a warning.

EDIT: yep, see ReleaseNotes · javamelody/javamelody Wiki · GitHub

  • Version 2.0.0 is a major release with breaking changes.
  • #1146 Migrate javamelody-core to Jakarta EE such as Tomcat 10. If you use Java EE such as Tomcat 9, then use instead the latest javamelody-core 1.x which is still maintained.

Done: https://www.xwiki.org/xwiki/bin/view/Documentation/AdminGuide/Monitoring#HJavaMelody