flow icon indicating copy to clipboard operation
flow copied to clipboard

Migrate Flow Quarkus add-on to Jakarta Servlet 5

Open mshabarov opened this issue 2 years ago • 4 comments

  • [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

mshabarov avatar Aug 24 '22 07:08 mshabarov

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)

mshabarov avatar Aug 26 '22 13:08 mshabarov

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)

mshabarov avatar Sep 01 '22 10:09 mshabarov

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 .

mshabarov avatar Sep 01 '22 11:09 mshabarov

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.

mshabarov avatar Sep 09 '22 07:09 mshabarov

One remaining point is to set up a release job for Java 17 and make Vaadin Quarkus add-on 2.0.0.alpha1

mshabarov avatar Oct 27 '22 06:10 mshabarov