Doing a deployment test, app fails with errors I can't quite figure out

I followed the steps for WAR deployment to a Tomcat server. I have Tomcat 9 installed and running, and the 2 WARs are in the webapps directory. When trying to load the app, I just get a blank screen with “Unexpected error - please contact system administrator” and a Retry button.

Looking into the app.log reveals the following chain of errors:

2019-12-20 10:58:58.322 DEBUG [http-nio-8080-exec-28] com.haulmont.cuba.web.App - Initializing application
2019-12-20 10:58:58.324 DEBUG [http-nio-8080-exec-28] com.haulmont.cuba.web.security.WebAnonymousSessionHolder - Loading anonymous session
2019-12-20 10:58:58.328 INFO  [http-nio-8080-exec-28] com.haulmont.cuba.core.sys.remoting.ClusteredHttpInvokerRequestExecutor - Invocation of http://localhost:8080/medflex-core/remoting/cuba_TrustedClientService failed: java.io.IOException: Did not receive successful HTTP response: status code = 404, status message = [null]
2019-12-20 10:58:58.329 INFO  [http-nio-8080-exec-28] com.haulmont.cuba.core.sys.remoting.ClusteredHttpInvokerRequestExecutor - No more URL available
2019-12-20 10:58:58.330 ERROR [http-nio-8080-exec-28] com.haulmont.cuba.web.AppUI - Unable to init ui
java.lang.RuntimeException: Unable to login as anonymous!
	at com.haulmont.cuba.web.DefaultApp.loginOnStart(DefaultApp.java:313) ~[cuba-web-7.1.2.jar:7.1.2]
	at com.haulmont.cuba.web.AppUI.setupUI(AppUI.java:477) ~[cuba-web-7.1.2.jar:7.1.2]
	at com.haulmont.cuba.web.AppUI.init(AppUI.java:337) ~[cuba-web-7.1.2.jar:7.1.2]
	at com.vaadin.ui.UI.doInit(UI.java:738) [vaadin-server-8.6.4-23-cuba.jar:8.6.4-23-cuba]
	at com.vaadin.server.communication.UIInitHandler.getBrowserDetailsUI(UIInitHandler.java:209) [vaadin-server-8.6.4-23-cuba.jar:8.6.4-23-cuba]
	at com.vaadin.server.communication.UIInitHandler.synchronizedHandleRequest(UIInitHandler.java:67) [vaadin-server-8.6.4-23-cuba.jar:8.6.4-23-cuba]
	at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:40) [vaadin-server-8.6.4-23-cuba.jar:8.6.4-23-cuba]
	at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1577) [vaadin-server-8.6.4-23-cuba.jar:8.6.4-23-cuba]
	at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:425) [vaadin-server-8.6.4-23-cuba.jar:8.6.4-23-cuba]
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:329) [cuba-web-7.1.2.jar:7.1.2]
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:215) [cuba-web-7.1.2.jar:7.1.2]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) [servlet-api.jar:na]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [catalina.jar:9.0.14]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.14]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) [tomcat-websocket.jar:9.0.14]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:9.0.14]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.14]
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:107) [spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
	at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:73) [spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
	at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:93) [cuba-web-7.1.2.jar:7.1.2]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:9.0.14]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.14]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) [catalina.jar:9.0.14]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [catalina.jar:9.0.14]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) [catalina.jar:9.0.14]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [catalina.jar:9.0.14]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [catalina.jar:9.0.14]
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668) [catalina.jar:9.0.14]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [catalina.jar:9.0.14]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [catalina.jar:9.0.14]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) [tomcat-coyote.jar:9.0.14]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-coyote.jar:9.0.14]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834) [tomcat-coyote.jar:9.0.14]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417) [tomcat-coyote.jar:9.0.14]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-coyote.jar:9.0.14]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_192]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_192]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:9.0.14]
	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_192]
Caused by: com.haulmont.cuba.security.global.InternalAuthenticationException: Exception is thrown by login provider
	at com.haulmont.cuba.web.security.ConnectionImpl.loginInternal(ConnectionImpl.java:208) ~[cuba-web-7.1.2.jar:7.1.2]
	at com.haulmont.cuba.web.security.ConnectionImpl.login(ConnectionImpl.java:91) ~[cuba-web-7.1.2.jar:7.1.2]
	at com.haulmont.cuba.web.DefaultApp.loginOnStart(DefaultApp.java:311) ~[cuba-web-7.1.2.jar:7.1.2]
	... 38 common frames omitted
Caused by: org.springframework.remoting.RemoteAccessException: Could not access HTTP invoker remote service at [cuba_TrustedClientService]; nested exception is java.io.IOException: Did not receive successful HTTP response: status code = 404, status message = [null]
	at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.convertHttpInvokerAccessException(HttpInvokerClientInterceptor.java:231) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
	at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.invoke(HttpInvokerClientInterceptor.java:157) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.6.RELEASE.jar:5.1.6.RELEASE]
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) ~[spring-aop-5.1.6.RELEASE.jar:5.1.6.RELEASE]
	at com.sun.proxy.$Proxy751.getAnonymousSession(Unknown Source) ~[na:na]
	at com.haulmont.cuba.web.security.WebAnonymousSessionHolder.getAnonymousSessionFromService(WebAnonymousSessionHolder.java:74) ~[cuba-web-7.1.2.jar:7.1.2]
	at com.haulmont.cuba.web.security.WebAnonymousSessionHolder.initializeAnonymousSession(WebAnonymousSessionHolder.java:65) ~[cuba-web-7.1.2.jar:7.1.2]
	at com.haulmont.cuba.web.security.WebAnonymousSessionHolder.checkInitialized(WebAnonymousSessionHolder.java:54) ~[cuba-web-7.1.2.jar:7.1.2]
	at com.haulmont.cuba.web.security.WebAnonymousSessionHolder.getAnonymousSession(WebAnonymousSessionHolder.java:43) ~[cuba-web-7.1.2.jar:7.1.2]
	at com.haulmont.cuba.web.security.providers.AnonymousLoginProvider.login(AnonymousLoginProvider.java:51) ~[cuba-web-7.1.2.jar:7.1.2]
	at com.haulmont.cuba.web.security.ConnectionImpl.loginInternal(ConnectionImpl.java:192) ~[cuba-web-7.1.2.jar:7.1.2]
	... 40 common frames omitted
Caused by: java.io.IOException: Did not receive successful HTTP response: status code = 404, status message = [null]
	at org.springframework.remoting.httpinvoker.SimpleHttpInvokerRequestExecutor.validateResponse(SimpleHttpInvokerRequestExecutor.java:187) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
	at com.haulmont.cuba.core.sys.remoting.ClusteredHttpInvokerRequestExecutor.doExecuteRequest(ClusteredHttpInvokerRequestExecutor.java:79) ~[cuba-global-7.1.2.jar:7.1.2]
	at org.springframework.remoting.httpinvoker.AbstractHttpInvokerRequestExecutor.executeRequest(AbstractHttpInvokerRequestExecutor.java:140) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
	at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.executeRequest(HttpInvokerClientInterceptor.java:206) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
	at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.executeRequest(HttpInvokerClientInterceptor.java:188) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
	at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.invoke(HttpInvokerClientInterceptor.java:154) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
	... 49 common frames omitted

Any ideas?

Interestingly, upgrading Tomcat from .14 to .30 fixed this issue.