Error with Upgrade from Xwiki 16 Tomcat 9 to Tomcat 11.0.5 - XWiki 17.1.0

I found this old issue which seems related, but I have the suggested “–add-opens” jvm options, am still getting this stack trace.

2025-03-31 14:42:38,629 [main] ERROR h.i.DefaultExtensionJobHistory - Failed to read extension job history from [C:\ProgramData\xwiki\extension\history\2025.03.25.xml]. 
java.lang.NullPointerException: Cannot invoke "java.util.List.size()" because "list" is null
	at java.base/java.util.Collections.reverse(Collections.java:384)
	at org.xwiki.extension.job.history.internal.DefaultExtensionJobHistory.load(DefaultExtensionJobHistory.java:176)
	at org.xwiki.extension.job.history.internal.DefaultExtensionJobHistory.initialize(DefaultExtensionJobHistory.java:112)
	at org.xwiki.component.embed.InitializableLifecycleHandler.handle(InitializableLifecycleHandler.java:39)
	at org.xwiki.component.embed.EmbeddableComponentManager.createInstance(EmbeddableComponentManager.java:610)
	at org.xwiki.component.embed.EmbeddableComponentManager.getComponentInstance(EmbeddableComponentManager.java:711)
	at org.xwiki.component.embed.EmbeddableComponentManager.getInstance(EmbeddableComponentManager.java:336)
	at org.xwiki.component.embed.EmbeddableComponentManager.getInstance(EmbeddableComponentManager.java:327)
	at org.xwiki.component.embed.EmbeddableComponentManager.getDependencyInstance(EmbeddableComponentManager.java:628)
	at org.xwiki.component.embed.EmbeddableComponentManager.createInstance(EmbeddableComponentManager.java:600)
	at org.xwiki.component.embed.EmbeddableComponentManager.getComponentInstance(EmbeddableComponentManager.java:711)
	at org.xwiki.component.embed.EmbeddableComponentManager.getInstance(EmbeddableComponentManager.java:336)
	at org.xwiki.component.embed.EmbeddableComponentManager.getInstance(EmbeddableComponentManager.java:327)
	at org.xwiki.observation.internal.DefaultObservationManager.initializeListeners(DefaultObservationManager.java:178)
	at org.xwiki.observation.internal.DefaultObservationManager.getListenersByEvent(DefaultObservationManager.java:143)
	at org.xwiki.observation.internal.DefaultObservationManager.notify(DefaultObservationManager.java:301)
	at org.xwiki.component.internal.StackingComponentEventManager.sendEvent(StackingComponentEventManager.java:151)
	at org.xwiki.component.internal.StackingComponentEventManager.flushEvents(StackingComponentEventManager.java:92)
	at org.xwiki.container.servlet.XWikiServletContextListener.contextInitialized(XWikiServletContextListener.java:151)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4019)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4444)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:566)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:653)
	at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1094)
	at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1897)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
	at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
	at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:123)
	at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:1005)
	at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:389)
	at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1593)
	at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:267)
	at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:109)
	at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:389)
	at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:336)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:743)
	at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:771)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1170)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1160)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
	at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
	at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:716)
	at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:203)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
	at org.apache.catalina.core.StandardService.startInternal(StandardService.java:415)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
	at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:866)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:759)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:342)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:470)


I added to my logback.xml:

<logger name="org.xwiki.xstream.internal" level="info"/>

But it didn’t seem to do anything.

My startup options are here:

31-Mar-2025 14:41:51.005 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name:   Apache Tomcat/11.0.5
31-Mar-2025 14:41:51.020 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Feb 28 2025 15:54:41 UTC
31-Mar-2025 14:41:51.020 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 11.0.5.0
31-Mar-2025 14:41:51.020 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Windows Server 2022
31-Mar-2025 14:41:51.020 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            10.0
31-Mar-2025 14:41:51.020 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
31-Mar-2025 14:41:51.020 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             C:\Program Files\Java\jdk-21
31-Mar-2025 14:41:51.020 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           21.0.4+8-LTS-274
31-Mar-2025 14:41:51.020 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Oracle Corporation
31-Mar-2025 14:41:51.020 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         C:\Program Files\Apache Software Foundation\Tomcat 11.0
31-Mar-2025 14:41:51.020 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         C:\Program Files\Apache Software Foundation\Tomcat 11.0
31-Mar-2025 14:41:51.036 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=C:\Program Files\Apache Software Foundation\Tomcat 11.0
31-Mar-2025 14:41:51.036 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=C:\Program Files\Apache Software Foundation\Tomcat 11.0
31-Mar-2025 14:41:51.036 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=C:\Program Files\Apache Software Foundation\Tomcat 11.0\temp
31-Mar-2025 14:41:51.036 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
31-Mar-2025 14:41:51.036 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=C:\Program Files\Apache Software Foundation\Tomcat 11.0\conf\logging.properties
31-Mar-2025 14:41:51.036 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
31-Mar-2025 14:41:51.036 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.lang=ALL-UNNAMED 
31-Mar-2025 14:41:51.036 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.io=ALL-UNNAMED 
31-Mar-2025 14:41:51.036 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.util=ALL-UNNAMED 
31-Mar-2025 14:41:51.036 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.util.concurrent=ALL-UNNAMED
31-Mar-2025 14:41:51.036 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: exit
31-Mar-2025 14:41:51.036 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: abort
31-Mar-2025 14:41:51.036 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Xms1024m
31-Mar-2025 14:41:51.036 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Xmx2048m

Note that this is not related to your issue. At Loading... Thomas suggested it but for the Loading... stacktrace, which is not the one you’re getting.

"info" is the default level already, maybe you meant to enable debug log (so "debug") ?

Yes. Of course you’re right. That is what I meant to do, but not what I did do.

“java.base does not “opens java.util” to unnamed module @4041739c

I thought that is what this does: “–add-opens=java.base/java.util=ALL-UNNAMED”


2025-04-01 12:50:28,219 [main] DEBUG o.x.x.i.SafeTreeUnmarshaller   - Got unknown exception when converting object of type [class org.xwiki.extension.job.history.ExtensionJobHistoryRecord] 
com.thoughtworks.xstream.converters.ConversionException: No converter available
---- Debugging information ----
message             : No converter available
type                : java.util.Collections$UnmodifiableMap
converter           : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
message[1]          : Unable to make field private static final long java.util.Collections$UnmodifiableMap.serialVersionUID accessible: module java.base does not "opens java.util" to unnamed module @4041739c
class               : org.xwiki.extension.job.history.ExtensionJobHistoryRecord
required-type       : org.xwiki.extension.job.history.ExtensionJobHistoryRecord
converter-type      : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
path                : /list/org.xwiki.extension.job.history.ExtensionJobHistoryRecord/answers
line number         : 79
-------------------------------


Apparently the extra equal sign isn’t a windows thing but a “JNI Invocation API” thing. It’s always an option though. Given that it is supposed to always work, maybe it should used instead on this page since the listed alternative without the equals sign does not. But I realize a thread where it’s clearly not working for me is not a great place to make that point.

Tomcat had the first 3 lines under Java 9 options as a default, and will not start without the equals after “–add-opens”, so I’m pretty sure I’m formatting them correctly.

image

My working prod environment doesn’t actually have the option for java.util. I wonder how it’s getting away without it.

image

Maybe getting a little further. It’s right that the xml files in <perm>/extension/history aren’t well formed, but it matches prod which is working.

2025-04-01 14:34:32,403 [main] DEBUG o.x.x.i.SafeTreeUnmarshaller   - Got unknown exception when converting object of type [class org.xwiki.extension.job.history.ExtensionJobHistoryRecord] 
com.thoughtworks.xstream.converters.ConversionException: 
---- Debugging information ----
cause-exception     : com.thoughtworks.xstream.io.StreamException
cause-message       : 
class               : org.xwiki.extension.job.history.ExtensionJobHistoryRecord
required-type       : org.xwiki.extension.job.history.ExtensionJobHistoryRecord
converter-type      : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
path                : /list/org.xwiki.extension.job.history.ExtensionJobHistoryRecord
line number         : 79
-------------------------------
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:81)
	at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:72)
	at org.xwiki.xstream.internal.SafeTreeUnmarshaller.convert(SafeTreeUnmarshaller.java:62)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:68)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:52)
	at com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter.readBareItem(AbstractCollectionConverter.java:132)
	at com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter.readItem(AbstractCollectionConverter.java:117)
	at com.thoughtworks.xstream.converters.collections.CollectionConverter.addCurrentElementToCollection(CollectionConverter.java:99)
	at com.thoughtworks.xstream.converters.collections.CollectionConverter.populateCollection(CollectionConverter.java:92)
	at com.thoughtworks.xstream.converters.collections.CollectionConverter.populateCollection(CollectionConverter.java:86)
	at com.thoughtworks.xstream.converters.collections.CollectionConverter.unmarshal(CollectionConverter.java:81)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:74)
	at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:72)
	at org.xwiki.xstream.internal.SafeTreeUnmarshaller.convert(SafeTreeUnmarshaller.java:62)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:68)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:52)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:136)
	at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32)
	at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1468)
	at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1445)
	at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1325)
	at org.xwiki.extension.job.history.internal.DefaultExtensionJobHistorySerializer.read(DefaultExtensionJobHistorySerializer.java:88)
	at org.xwiki.extension.job.history.internal.DefaultExtensionJobHistorySerializer.read(DefaultExtensionJobHistorySerializer.java:95)
	at org.xwiki.extension.job.history.internal.DefaultExtensionJobHistory.load(DefaultExtensionJobHistory.java:175)
	at org.xwiki.extension.job.history.internal.DefaultExtensionJobHistory.initialize(DefaultExtensionJobHistory.java:112)
	at org.xwiki.component.embed.InitializableLifecycleHandler.handle(InitializableLifecycleHandler.java:39)
	at org.xwiki.component.embed.EmbeddableComponentManager.createInstance(EmbeddableComponentManager.java:610)
	at org.xwiki.component.embed.EmbeddableComponentManager.getComponentInstance(EmbeddableComponentManager.java:711)
	at org.xwiki.component.embed.EmbeddableComponentManager.getInstance(EmbeddableComponentManager.java:336)
	at org.xwiki.component.embed.EmbeddableComponentManager.getInstance(EmbeddableComponentManager.java:327)
	at org.xwiki.component.embed.EmbeddableComponentManager.getDependencyInstance(EmbeddableComponentManager.java:628)
	at org.xwiki.component.embed.EmbeddableComponentManager.createInstance(EmbeddableComponentManager.java:600)
	at org.xwiki.component.embed.EmbeddableComponentManager.getComponentInstance(EmbeddableComponentManager.java:711)
	at org.xwiki.component.embed.EmbeddableComponentManager.getInstance(EmbeddableComponentManager.java:336)
	at org.xwiki.component.embed.EmbeddableComponentManager.getInstance(EmbeddableComponentManager.java:327)
	at org.xwiki.observation.internal.DefaultObservationManager.initializeListeners(DefaultObservationManager.java:178)
	at org.xwiki.observation.internal.DefaultObservationManager.getListenersByEvent(DefaultObservationManager.java:143)
	at org.xwiki.observation.internal.DefaultObservationManager.notify(DefaultObservationManager.java:301)
	at org.xwiki.component.internal.StackingComponentEventManager.sendEvent(StackingComponentEventManager.java:151)
	at org.xwiki.component.internal.StackingComponentEventManager.flushEvents(StackingComponentEventManager.java:92)
	at org.xwiki.container.servlet.XWikiServletContextListener.contextInitialized(XWikiServletContextListener.java:151)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4019)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4444)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:566)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:653)
	at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1094)
	at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1897)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
	at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
	at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:123)
	at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:1005)
	at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:389)
	at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1593)
	at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:267)
	at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:109)
	at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:389)
	at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:336)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:743)
	at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:771)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1170)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1160)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
	at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
	at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:716)
	at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:203)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
	at org.apache.catalina.core.StandardService.startInternal(StandardService.java:415)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
	at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:866)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:759)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:342)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:470)
Caused by: com.thoughtworks.xstream.io.StreamException: 
	at com.thoughtworks.xstream.io.xml.XppReader.pullNextEvent(XppReader.java:124)
	at com.thoughtworks.xstream.io.xml.AbstractPullReader.readRealEvent(AbstractPullReader.java:148)
	at com.thoughtworks.xstream.io.xml.AbstractPullReader.readEvent(AbstractPullReader.java:135)
	at com.thoughtworks.xstream.io.xml.AbstractPullReader.hasMoreChildren(AbstractPullReader.java:87)
	at com.thoughtworks.xstream.io.ReaderWrapper.hasMoreChildren(ReaderWrapper.java:32)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:324)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:277)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:74)
	... 78 common frames omitted
Caused by: org.xmlpull.v1.XmlPullParserException: end tag name </list> must match start tag name <org.xwiki.extension.job.history.ExtensionJobHistoryRecord> from line 1 (position: END_TAG seen ...</list>... @79:66) 
	at io.github.xstream.mxparser.MXParser.parseEndTag(MXParser.java:1693)
	at io.github.xstream.mxparser.MXParser.nextImpl(MXParser.java:1183)
	at io.github.xstream.mxparser.MXParser.next(MXParser.java:1104)
	at com.thoughtworks.xstream.io.xml.XppReader.pullNextEvent(XppReader.java:109)
	... 85 common frames omitted


Turned on the debug logging in prod and it gets the same issues with the xml but this doesn’t lead to an error.

Well this is probably not my problem. Damn. I added those --add-opens options to prod and starting getting the same errors, but prod works even with the errors. They must not be fatal.

Those errors are definitely not fatal. Unless you need to view this specific extension history, of course.

That was dumb of me. I could see that Tomcat was running, but I think I thought the webapp was crashing before giving a result, but that doesn’t really make any sense at all. I started looking in the logs to figure out why it wasn’t responding. Even an uncaught exception gives something back to the browser. If I had checked the access log, I would have realized my requests weren’t even reaching the server. Firewall issue. Embarrassing. I often work while tired.

I am curious why I have a bunch xml files not properly closed though. The servers get cycled at night to take updates. I would think we request a reboot, which should nicely ask services like Tomcat to stop, but I’ll need to look into that.