flow
flow copied to clipboard
Migrate Flow Quarkus add-on to Jakarta Servlet 5
- [x] Check if a new Servlet 5 compatible version of Quarkus is available
- [x] Migrate the sources
- [x] Test with starter project
- [ ] create CI for snapshot validation and release
- [ ] release Quarkus 2.0.0.alpha1
Quarkus has a Jakarta EE 9 migration tools and nightly snapshots, see https://github.com/quarkusio/quarkus/tree/main/jakarta .
Vaadin Quarkus add-on has a feature branch with migrated sources, see https://github.com/vaadin/quarkus/tree/feature/jakarta-servlet5 .
Quarkus snapshot 999-jakarta-SNAPSHOT
is used so far.
All tests pass, but with base starter I get the following error, when run mvn clean install -DskipTests
:
[ERROR] Failed to execute goal io.quarkus:quarkus-maven-plugin:2.12.0.Final:build (default) on project base-starter-flow-quarkus: Failed to build quarkus application: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[ERROR] [error]: Build step com.vaadin.quarkus.deployment.VaadinQuarkusProcessor#setupPush threw an exception: java.lang.NullPointerException: Cannot invoke "io.quarkus.websockets.client.deployment.WebSocketDeploymentInfoBuildItem.getInfo()" because "webSocketDeploymentInfoBuildItem" is null
[ERROR] at com.vaadin.quarkus.deployment.VaadinQuarkusProcessor.setupPush(VaadinQuarkusProcessor.java:218)
[ERROR] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[ERROR] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
[ERROR] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[ERROR] at java.base/java.lang.reflect.Method.invoke(Method.java:568)
[ERROR] at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:909)
[ERROR] at io.quarkus.builder.BuildContext.run(BuildContext.java:281)
[ERROR] at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
[ERROR] at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2449)
[ERROR] at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1478)
[ERROR] at java.base/java.lang.Thread.run(Thread.java:833)
[ERROR] at org.jboss.threads.JBossThread.run(JBossThread.java:501)
I stepped further and migrated platform
repo to the jakarta.servet
and build it locally to get vaadin-core-jandex
artifact, since it is used by vaadin-quarkus-extension
.
When I start the base starter, I get the following:
java.lang.NoSuchMethodError: 'void jakarta.enterprise.inject.spi.BeanManager.fireEvent(java.lang.Object, java.lang.annotation.Annotation[])'
at com.vaadin.quarkus.QuarkusInstantiator.lambda$getServiceInitListeners$5c93f3b0$1(QuarkusInstantiator.java:135)
at com.vaadin.flow.server.VaadinService.lambda$init$0(VaadinService.java:239)
at java.base/java.util.stream.Streams$StreamBuilderImpl.forEachRemaining(Streams.java:411)
at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735)
at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
at com.vaadin.flow.server.VaadinService.lambda$init$1(VaadinService.java:239)
at com.vaadin.flow.server.VaadinService.runWithServiceContext(VaadinService.java:2353)
at com.vaadin.flow.server.VaadinService.init(VaadinService.java:237)
at com.vaadin.flow.server.VaadinServletService.init(VaadinServletService.java:171)
at com.vaadin.quarkus.QuarkusVaadinServletService.init(QuarkusVaadinServletService.java:88)
at com.vaadin.quarkus.QuarkusVaadinServlet.createServletService(QuarkusVaadinServlet.java:57)
at com.vaadin.flow.server.VaadinServlet.createServletService(VaadinServlet.java:237)
at com.vaadin.flow.server.VaadinServlet.init(VaadinServlet.java:117)
at com.vaadin.quarkus.QuarkusVaadinServlet.init(QuarkusVaadinServlet.java:66)
at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:118)
at io.undertow.servlet.core.ManagedServlet$DefaultInstanceStrategy.start(ManagedServlet.java:300)
at io.undertow.servlet.core.ManagedServlet.forceInit(ManagedServlet.java:212)
at io.undertow.servlet.handlers.ServletChain.forceInit(ServletChain.java:130)
at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:63)
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
at io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:67)
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:133)
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:65)
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:247)
at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:56)
at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:111)
at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:108)
at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
at io.quarkus.undertow.runtime.UndertowDeploymentRecorder$9$1.call(UndertowDeploymentRecorder.java:595)
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:227)
at io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:152)
at io.quarkus.undertow.runtime.UndertowDeploymentRecorder$1.handleRequest(UndertowDeploymentRecorder.java:120)
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:284)
at io.undertow.server.DefaultExchangeHandler.handle(DefaultExchangeHandler.java:18)
at io.quarkus.undertow.runtime.UndertowDeploymentRecorder$5$1.run(UndertowDeploymentRecorder.java:417)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at io.quarkus.vertx.core.runtime.VertxCoreRecorder$14.runWith(VertxCoreRecorder.java:560)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2449)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1478)
at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29)
at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
Last problem with the absent method was resolved: BeanManager
has no fireEvent
method anymore in CDI API 4.0, but instead BeanManager.getEvent(event).fire()
should be used.
Starter project now works as expected in development
and production
modes. I used vaadin-quarkus
and vaadin-core-jandex
dependencies local snapshots for testing and built them from:
Quarkus add-on feature branch: https://github.com/vaadin/quarkus/tree/feature/jakarta-servlet5 Platform feature branch: https://github.com/vaadin/platform/tree/feature/jakarta-servlet5
Then I used this branch in the base starter for testing https://github.com/vaadin/base-starter-flow-quarkus/tree/feature/jakarta-servlet5 .
This issue is reopened, because since 08.09.2022:
- I got the following error for all the IT tests in Quarkus add-on:
2022-09-09 09:36:54,617 ERROR [io.und.request] (executor-thread-0) UT005071: Undertow request failed HttpServerExchange{ GET /uievents delegate io.undertow.vertx.VertxHttpExchange@23eecb48}: java.lang.NoClassDefFoundError: jakarta/servlet/ServletConnection
at io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:132)
at io.quarkus.undertow.runtime.UndertowDeploymentRecorder$1.handleRequest(UndertowDeploymentRecorder.java:120)
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:284)
at io.undertow.server.DefaultExchangeHandler.handle(DefaultExchangeHandler.java:18)
at io.quarkus.undertow.runtime.UndertowDeploymentRecorder$5$1.run(UndertowDeploymentRecorder.java:417)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at io.quarkus.vertx.core.runtime.VertxCoreRecorder$14.runWith(VertxCoreRecorder.java:560)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2449)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1478)
at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29)
at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.ClassNotFoundException: jakarta.servlet.ServletConnection
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
at io.quarkus.bootstrap.runner.RunnerClassLoader.loadClass(RunnerClassLoader.java:114)
at io.quarkus.bootstrap.runner.RunnerClassLoader.loadClass(RunnerClassLoader.java:64)
... 14 more
- Flow-Quarkus base starter fails in dev mode with:
Exception in thread "main" java.lang.RuntimeException: java.lang.NoSuchMethodError: 'boolean io.quarkus.bootstrap.app.CuratedApplication.hasReloadableArtifacts()'
at io.quarkus.deployment.dev.DevModeMain.start(DevModeMain.java:137)
at io.quarkus.deployment.dev.DevModeMain.main(DevModeMain.java:62)
Caused by: java.lang.NoSuchMethodError: 'boolean io.quarkus.bootstrap.app.CuratedApplication.hasReloadableArtifacts()'
at io.quarkus.deployment.dev.QuarkusCompiler.<init>(QuarkusCompiler.java:68)
at io.quarkus.deployment.dev.IsolatedDevModeMain.setupRuntimeCompilation(IsolatedDevModeMain.java:252)
at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:441)
at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:60)
at io.quarkus.bootstrap.app.CuratedApplication.runInCl(CuratedApplication.java:148)
at io.quarkus.bootstrap.app.CuratedApplication.runInAugmentClassLoader(CuratedApplication.java:103)
at io.quarkus.deployment.dev.DevModeMain.start(DevModeMain.java:131)
... 1 more
Might be related to changes in Quarkus in 999-jakarta-SNAPSHOT
.
One remaining point is to set up a release job for Java 17 and make Vaadin Quarkus add-on 2.0.0.alpha1