Vaadin 8.4.0 - Breaks websocket / push

Vaadin 8.3.3 works perfectly, Vaadin 8.4.0 fails with websocket errors at startup. The webapp works, but without push. Environment:

Apr 26, 2018 10:12:18 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server number:         9.0.7.0
Apr 26, 2018 10:12:18 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Name:               Mac OS X
Apr 26, 2018 10:12:18 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Version:            10.13.4
Apr 26, 2018 10:12:18 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Architecture:          x86_64
Apr 26, 2018 10:12:18 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Java Home:             /Library/Java/JavaVirtualMachines/jdk-10.0.1.jdk/Contents/Home
Apr 26, 2018 10:12:18 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Version:           10.0.1+10
Apr 26, 2018 10:12:18 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Vendor:            "Oracle Corporation"

The problem affects each of the servlets at startup. Here is an example configuration at the top of a Servlet class:

@WebServlet(urlPatterns = {"/counter/*"}, asyncSupported = true)
@VaadinServletConfiguration(
		productionMode = Constants.PRODUCTIONMODE, 
		ui = CounterUI.class, 
		widgetset = "ca.demy.widgetset.FossWidgetset",
		heartbeatInterval = 60,
		closeIdleSessions = true
		)

And here’s the startup error under Vaadin 8.4.0. No such problem with 8.3.3.

Apr 26, 2018 9:54:40 AM org.atmosphere.cpr.AtmosphereFramework initWebSocket
INFO: Installed WebSocketProtocol org.atmosphere.websocket.protocol.SimpleHttpProtocol 
Apr 26, 2018 9:54:40 AM org.atmosphere.container.JSR356AsyncSupport <init>
INFO: JSR 356 Mapping path /counter
Apr 26, 2018 9:54:40 AM org.atmosphere.cpr.DefaultAsyncSupportResolver newCometSupport
WARNING: Failed to create AsyncSupport class: class org.atmosphere.container.JSR356AsyncSupport, error: java.lang.reflect.InvocationTargetException
Apr 26, 2018 9:54:40 AM org.atmosphere.cpr.DefaultAsyncSupportResolver newCometSupport
SEVERE: Real error: The path 
[/counter/{path0}/] contains one or more empty segments which are is not permitted
java.lang.IllegalArgumentException: The path 
[/counter/{path0}/] contains one or more empty segments which are is not permitted
	at org.apache.tomcat.websocket.server.UriTemplate.<init>(UriTemplate.java:71)
	at org.apache.tomcat.websocket.server.WsServerContainer.addEndpoint(WsServerContainer.java:153)
	at org.atmosphere.container.JSR356AsyncSupport.<init>(JSR356AsyncSupport.java:99)
	at org.atmosphere.container.JSR356AsyncSupport.<init>(JSR356AsyncSupport.java:42)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488)
	at org.atmosphere.cpr.DefaultAsyncSupportResolver.newCometSupport(DefaultAsyncSupportResolver.java:237)
	at org.atmosphere.cpr.DefaultAsyncSupportResolver.resolveWebSocket(DefaultAsyncSupportResolver.java:308)
	at org.atmosphere.cpr.DefaultAsyncSupportResolver.resolve(DefaultAsyncSupportResolver.java:294)
	at org.atmosphere.cpr.AtmosphereFramework.autoDetectContainer(AtmosphereFramework.java:2085)
	at org.atmosphere.cpr.AtmosphereFramework.init(AtmosphereFramework.java:914)
	at org.atmosphere.cpr.AtmosphereFramework.init(AtmosphereFramework.java:838)
	at com.vaadin.server.communication.PushRequestHandler.initAtmosphere(PushRequestHandler.java:212)
	at com.vaadin.server.communication.JSR356WebsocketInitializer.initAtmosphereForVaadinServlet(JSR356WebsocketInitializer.java:152)
	at com.vaadin.server.communication.JSR356WebsocketInitializer.contextInitialized(JSR356WebsocketInitializer.java:118)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4602)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5066)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1427)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1417)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
	at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:943)
	at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:839)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1427)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1417)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
	at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:943)
	at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:258)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.StandardService.startInternal(StandardService.java:422)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:770)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:682)
	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:564)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:350)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:492)

It looks like Tomcat is getting empty segments on the path under 8.4.0.

Any ideas?

This is known issue (and impacts only Tomcat), and the fix is under works.

https://github.com/vaadin/framework/issues/10816

The fix has been merged to master, so it is already in 8.5-SNAPSHOT, and will be in 8.4.1 soon.