vaadin / quarkus

An extension to Quarkus to support Vaadin Flow
Apache License 2.0
28 stars 3 forks source link

Class initialization and native executable issue #54

Open juanmbellini opened 2 years ago

juanmbellini commented 2 years ago

Hi, as you can read from the title, I'm having some issues when building a native executable. The command that I'm using is the following:

export NODE_OPTIONS=--openssl-legacy-provider
./gradlew vaadinClean vaadinBuildFrontend build \
  -Pvaadin.productionMode \
  -Dquarkus.package.type=native

When executing that, several stacktraces appear saying that class initialization fails:

Error: Class initialization of org.atmosphere.container.TomcatWebSocketUtil failed. Use the option --initialize-at-run-time=org.atmosphere.container.TomcatWebSocketUtil to explicitly request delayed initialization of this class.
Original exception that caused the problem: java.lang.NoClassDefFoundError: org/apache/coyote/http11/upgrade/UpgradeInbound
        at java.base/jdk.internal.misc.Unsafe.ensureClassInitialized0(Native Method)
        at java.base/jdk.internal.misc.Unsafe.ensureClassInitialized(Unsafe.java:1155)
        at jdk.unsupported/sun.misc.Unsafe.ensureClassInitialized(Unsafe.java:743)
        at jdk.internal.vm.compiler/org.graalvm.compiler.serviceprovider.GraalUnsafeAccess.ensureClassInitialized(GraalUnsafeAccess.java:77)
        at com.oracle.svm.hosted.classinitialization.ConfigurableClassInitialization.ensureClassInitialized(ConfigurableClassInitialization.java:178)
        at com.oracle.svm.hosted.classinitialization.ConfigurableClassInitialization.computeInitKindAndMaybeInitializeClass(ConfigurableClassInitialization.java:648)
        at com.oracle.svm.hosted.classinitialization.ConfigurableClassInitialization.computeInitKindAndMaybeInitializeClass(ConfigurableClassInitialization.java:131)
        at com.oracle.svm.hosted.classinitialization.ConfigurableClassInitialization.maybeInitializeHosted(ConfigurableClassInitialization.java:169)
        at com.oracle.svm.hosted.SVMHost.initializeType(SVMHost.java:278)
        at com.oracle.graal.pointsto.meta.AnalysisType.lambda$new$0(AnalysisType.java:234)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1395)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
        at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
        at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
        at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
        at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)
Caused by: java.lang.ClassNotFoundException: org.apache.coyote.http11.upgrade.UpgradeInbound
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:445)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:587)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
        ... 18 more

In order to avoid this, I added the following to the application.properties files:

quarkus.native.additional-build-args=-H:ReflectionConfigurationFiles=reflection-config.json,\
  --initialize-at-run-time=\
    org.atmosphere.container

However, it doesn't seem to work. Those classes are still getting initialized.

Is there something I'm missing? Quarkus version: 2.5.2.Final. Vaadin version: 22.0.2

caalador commented 2 years ago

Hi.

Due to some resourcing shortage lately we have not had time to look into the native compilation of a vaadin project.

But due to the exception I would like to know if you are using SpringBoot and what version of tomcat are you using? It would seem that the org.apache.coyote.http11.upgrade.UpgradeInbound class was removed in Tomcat 8.0.x which makes it sound like something is using some old api that is not available anymore.

juanmbellini commented 2 years ago

Hi! I'm not using Spring Boot. I'm using Quarkus 2.5.2. That stacktrace is just a part of the whole log. There is another part in which the stacktrace is the following:

Error: Class initialization of org.atmosphere.container.AbstractJetty9AsyncSupportWithWebSocket failed. Use the option --initialize-at-run-time=org.atmosphere.container.AbstractJetty9AsyncSupportWithWebSocket to explicitly request delayed initialization of this class.
Original exception that caused the problem: java.lang.NoClassDefFoundError: org/eclipse/jetty/websocket/servlet/WebSocketCreator
        at java.base/jdk.internal.misc.Unsafe.ensureClassInitialized0(Native Method)
        at java.base/jdk.internal.misc.Unsafe.ensureClassInitialized(Unsafe.java:1155)
        at jdk.unsupported/sun.misc.Unsafe.ensureClassInitialized(Unsafe.java:743)
        at jdk.internal.vm.compiler/org.graalvm.compiler.serviceprovider.GraalUnsafeAccess.ensureClassInitialized(GraalUnsafeAccess.java:77)
        at com.oracle.svm.hosted.classinitialization.ConfigurableClassInitialization.ensureClassInitialized(ConfigurableClassInitialization.java:178)
        at com.oracle.svm.hosted.classinitialization.ConfigurableClassInitialization.computeInitKindAndMaybeInitializeClass(ConfigurableClassInitialization.java:648)
        at com.oracle.svm.hosted.classinitialization.ConfigurableClassInitialization.computeInitKindAndMaybeInitializeClass(ConfigurableClassInitialization.java:622)
        at com.oracle.svm.hosted.classinitialization.ConfigurableClassInitialization.computeInitKindAndMaybeInitializeClass(ConfigurableClassInitialization.java:131)
        at com.oracle.svm.hosted.classinitialization.ConfigurableClassInitialization.maybeInitializeHosted(ConfigurableClassInitialization.java:169)
        at com.oracle.svm.hosted.SVMHost.initializeType(SVMHost.java:278)
        at com.oracle.graal.pointsto.meta.AnalysisType.lambda$new$0(AnalysisType.java:234)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1395)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
        at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
        at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
        at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
        at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)
Caused by: java.lang.ClassNotFoundException: org.eclipse.jetty.websocket.servlet.WebSocketCreator
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:445)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:587)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
        ... 19 more

As you can see, it tells that the class org.eclipse.jetty.websocket.servlet.WebSocketCreator is missing.

What I see is that when creating the native executable, it starts initializing all of the *Support classes in the org.atmosphere.container package, and these classes rely on the platform for which these support classes are created for. For Quarkus, the support must be for Vert.x and Netty, so Tomcat, Jetty, Grizzly, etc are not needed.

caalador commented 2 years ago

As there is issues with Push on websockets you could try to exclude the flow-push dependency and see if that helps as the Atmosphere shouldn't be initalized. This would at least hopefully give some insight to what is happening

juanmbellini commented 2 years ago

I tried doing that (and explicitly adding org.atmosphere:nettosphere:3.2.5), and another issue appears:

> Task :quarkusBuild
building quarkus jar

[INFO] Checking for existing resources in: ~/projects/frontend/src/main/kubernetes.
[frontend-0.0.1-RELEASE-runner:21863]    classlist:   2.871,67 ms,  1,19 GB
[frontend-0.0.1-RELEASE-runner:21863]        (cap):   2.697,45 ms,  1,19 GB
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:~/projects/frontend/build/frontend-0.0.1-RELEASE-native-image-source-jar/lib/ch.qos.logback.logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:~/projects/frontend/build/frontend-0.0.1-RELEASE-native-image-source-jar/lib/org.jboss.slf4j.slf4j-jboss-logmanager-1.1.0.Final.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
04:35:02.351 [ForkJoinPool-2-worker-4] DEBUG io.netty.util.internal.logging.InternalLoggerFactory - Using SLF4J as the default logging framework
04:35:02.352 [ForkJoinPool-2-worker-4] DEBUG io.netty.buffer.AbstractByteBuf - -Dio.netty.buffer.checkAccessible: true
04:35:02.352 [ForkJoinPool-2-worker-4] DEBUG io.netty.buffer.AbstractByteBuf - -Dio.netty.buffer.checkBounds: true
04:35:02.353 [ForkJoinPool-2-worker-4] DEBUG io.netty.util.ResourceLeakDetector - -Dio.netty.leakDetection.level: disabled
04:35:02.353 [ForkJoinPool-2-worker-4] DEBUG io.netty.util.ResourceLeakDetector - -Dio.netty.leakDetection.targetRecords: 4
04:35:02.355 [ForkJoinPool-2-worker-4] DEBUG io.netty.util.ResourceLeakDetectorFactory - Loaded default ResourceLeakDetector: io.netty.util.ResourceLeakDetector@79d42ad1
[frontend-0.0.1-RELEASE-runner:21863]        setup:   4.253,97 ms,  1,19 GB
04:35:04,003 INFO  [io.und.servlet] Initializing AtmosphereFramework
04:35:07.494 [ForkJoinPool-2-worker-8] DEBUG io.netty.util.internal.PlatformDependent0 - -Dio.netty.noUnsafe: false
04:35:07.494 [ForkJoinPool-2-worker-8] DEBUG io.netty.util.internal.PlatformDependent0 - Java version: 17
04:35:07.494 [ForkJoinPool-2-worker-8] DEBUG io.netty.util.internal.PlatformDependent0 - sun.misc.Unsafe.theUnsafe: available
04:35:07.495 [ForkJoinPool-2-worker-8] DEBUG io.netty.util.internal.PlatformDependent0 - sun.misc.Unsafe.copyMemory: available
04:35:07.495 [ForkJoinPool-2-worker-8] DEBUG io.netty.util.internal.PlatformDependent0 - java.nio.Buffer.address: available
04:35:07.495 [ForkJoinPool-2-worker-8] DEBUG io.netty.util.internal.PlatformDependent0 - direct buffer constructor: unavailable: Reflective setAccessible(true) disabled
04:35:07.495 [ForkJoinPool-2-worker-8] DEBUG io.netty.util.internal.PlatformDependent0 - java.nio.Bits.unaligned: unavailable, true, Reflective setAccessible(true) disabled
04:35:07.495 [ForkJoinPool-2-worker-8] DEBUG io.netty.util.internal.PlatformDependent0 - jdk.internal.misc.Unsafe.allocateUninitializedArray(int): available
04:35:07.495 [ForkJoinPool-2-worker-8] DEBUG io.netty.util.internal.PlatformDependent0 - java.nio.DirectByteBuffer.<init>(long, int): unavailable
04:35:07.496 [ForkJoinPool-2-worker-8] DEBUG io.netty.util.internal.PlatformDependent - sun.misc.Unsafe: available
04:35:07.506 [ForkJoinPool-2-worker-8] DEBUG io.netty.util.internal.PlatformDependent - maxDirectMemory: 13362528256 bytes (maybe)
04:35:07.506 [ForkJoinPool-2-worker-8] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.tmpdir: /var/folders/m_/lggr3l1x1zn6j_jy6kgtwb6m0000gn/T (java.io.tmpdir)
04:35:07.506 [ForkJoinPool-2-worker-8] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.bitMode: 64 (sun.arch.data.model)
04:35:07.509 [ForkJoinPool-2-worker-8] DEBUG io.netty.util.internal.PlatformDependent - Platform: MacOS
04:35:07.510 [ForkJoinPool-2-worker-8] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.maxDirectMemory: -1 bytes
04:35:07.510 [ForkJoinPool-2-worker-8] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.uninitializedArrayAllocationThreshold: 1024
04:35:07.510 [ForkJoinPool-2-worker-8] DEBUG io.netty.util.internal.CleanerJava9 - java.nio.ByteBuffer.cleaner(): available
04:35:07.511 [ForkJoinPool-2-worker-8] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.noPreferDirect: false
04:35:08.252 [ForkJoinPool-2-worker-7] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.maxCapacityPerThread: 4096
04:35:08.253 [ForkJoinPool-2-worker-7] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.maxSharedCapacityFactor: 2
04:35:08.253 [ForkJoinPool-2-worker-7] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.linkCapacity: 16
04:35:08.253 [ForkJoinPool-2-worker-7] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.ratio: 8
04:35:08.253 [ForkJoinPool-2-worker-7] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.delayedQueue.ratio: 8
04:35:08.253 [ForkJoinPool-2-worker-7] DEBUG io.netty.util.internal.InternalThreadLocalMap - -Dio.netty.threadLocalMap.stringBuilder.initialSize: 1024
04:35:08.253 [ForkJoinPool-2-worker-7] DEBUG io.netty.util.internal.InternalThreadLocalMap - -Dio.netty.threadLocalMap.stringBuilder.maxSize: 4096
04:35:08.254 [ForkJoinPool-2-worker-11] DEBUG io.netty.buffer.AdvancedLeakAwareByteBuf - -Dio.netty.leakDetection.acquireAndReleaseOnly: false
04:35:08.438 [ForkJoinPool-2-worker-7] DEBUG io.netty.channel.DefaultChannelId - -Dio.netty.processId: 21863 (auto-detected)
04:35:08.438 [ForkJoinPool-2-worker-7] DEBUG io.netty.channel.DefaultChannelId - -Dio.netty.machineId: de:03:69:b1:89:f0:04:9c (user-set)
04:35:08,477 INFO  [org.jbo.threads] JBoss Threads version 3.4.2.Final
04:35:08.685 [ForkJoinPool-2-worker-8] DEBUG io.netty.channel.nio.NioEventLoop - -Dio.netty.noKeySetOptimization: false
04:35:08.686 [ForkJoinPool-2-worker-8] DEBUG io.netty.channel.nio.NioEventLoop - -Dio.netty.selectorAutoRebuildThreshold: 512
04:35:08.730 [ForkJoinPool-2-worker-2] DEBUG io.netty.util.NetUtil - -Djava.net.preferIPv4Stack: false
04:35:08.730 [ForkJoinPool-2-worker-2] DEBUG io.netty.util.NetUtil - -Djava.net.preferIPv6Addresses: false
04:35:08.734 [ForkJoinPool-2-worker-2] DEBUG io.netty.util.NetUtilInitializations - Loopback interface: lo0 (lo0, 0:0:0:0:0:0:0:1%lo0)
04:35:08.735 [ForkJoinPool-2-worker-2] DEBUG io.netty.util.NetUtil - Failed to get SOMAXCONN from sysctl and file /proc/sys/net/core/somaxconn. Default: 128
04:35:09.985 [ForkJoinPool-2-worker-12] DEBUG io.netty.handler.ssl.OpenSsl - netty-tcnative not in the classpath; OpenSslEngine will be unavailable.
04:35:10.552 [ForkJoinPool-2-worker-4] DEBUG io.netty.handler.ssl.JdkSslContext - Default protocols (JDK): [TLSv1.3, TLSv1.2] 
04:35:10.553 [ForkJoinPool-2-worker-4] DEBUG io.netty.handler.ssl.JdkSslContext - Default cipher suites (JDK): [TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_AES_128_GCM_SHA256, TLS_AES_256_GCM_SHA384]
04:35:10.856 [ForkJoinPool-2-worker-7] DEBUG io.netty.handler.codec.compression.ZlibCodecFactory - -Dio.netty.noJdkZlibDecoder: false
04:35:10.856 [ForkJoinPool-2-worker-7] DEBUG io.netty.handler.codec.compression.ZlibCodecFactory - -Dio.netty.noJdkZlibEncoder: false
04:35:13.674 [ForkJoinPool-2-worker-5] DEBUG io.netty.channel.MultithreadEventLoopGroup - -Dio.netty.eventLoopThreads: 24
04:35:14.388 [ForkJoinPool-2-worker-3] DEBUG com.helger.commons.lang.ServiceLoaderHelper - Finished retrieving all 1 SPI implementations of interface com.helger.commons.hashcode.IHashCodeImplementationRegistrarSPI
04:35:14.400 [ForkJoinPool-2-worker-3] DEBUG com.helger.commons.hashcode.HashCodeImplementationRegistry - Reinitialized com.helger.commons.hashcode.HashCodeImplementationRegistry
04:35:14.573 [ForkJoinPool-2-worker-9] DEBUG com.helger.commons.lang.ServiceLoaderHelper - Finished retrieving all 1 SPI implementations of interface com.helger.commons.equals.IEqualsImplementationRegistrarSPI
04:35:14.585 [ForkJoinPool-2-worker-9] DEBUG com.helger.commons.equals.EqualsImplementationRegistry - Reinitialized com.helger.commons.equals.EqualsImplementationRegistry
[frontend-0.0.1-RELEASE-runner:21863]     analysis:  18.839,56 ms,  5,47 GB
Fatal error:com.oracle.graal.pointsto.util.AnalysisError$ParsingError: Error encountered while parsing org.apache.commons.logging.LogAdapter$Log4jLog.<clinit>() 
Parsing context: <no parsing context available> 

        at com.oracle.graal.pointsto.util.AnalysisError.parsingError(AnalysisError.java:133)
        at com.oracle.graal.pointsto.flow.MethodTypeFlow.createTypeFlow(MethodTypeFlow.java:311)
        at com.oracle.graal.pointsto.flow.MethodTypeFlow.ensureTypeFlowCreated(MethodTypeFlow.java:282)
        at com.oracle.graal.pointsto.flow.MethodTypeFlow.addContext(MethodTypeFlow.java:103)
        at com.oracle.graal.pointsto.PointsToAnalysis$1.run(PointsToAnalysis.java:463)
        at com.oracle.graal.pointsto.util.CompletionExecutor.executeCommand(CompletionExecutor.java:188)
        at com.oracle.graal.pointsto.util.CompletionExecutor.lambda$executeService$0(CompletionExecutor.java:172)
        at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1395)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
        at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
        at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
        at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
        at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)
Caused by: com.oracle.graal.pointsto.util.AnalysisError: parsing had failed in another thread
        at com.oracle.graal.pointsto.util.AnalysisError.shouldNotReachHere(AnalysisError.java:153)
        at com.oracle.graal.pointsto.meta.AnalysisMethod.ensureGraphParsed(AnalysisMethod.java:656)
        at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.parse(MethodTypeFlowBuilder.java:163)
        at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.apply(MethodTypeFlowBuilder.java:321)
        at com.oracle.graal.pointsto.flow.MethodTypeFlow.createTypeFlow(MethodTypeFlow.java:293)
        ... 11 more
Caused by: org.graalvm.compiler.java.BytecodeParser$BytecodeParserError: com.oracle.graal.pointsto.constraints.UnresolvedElementException: Discovered unresolved type during parsing: org.apache.logging.log4j.LogManager. To diagnose the issue you can use the --allow-incomplete-classpath option. The missing type is then reported at run time when it is accessed the first time.
        at parsing org.apache.commons.logging.LogAdapter$Log4jLog.<clinit>(LogAdapter.java:155)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.throwParserError(BytecodeParser.java:2624)
        at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.throwParserError(SharedGraphBuilderPhase.java:107)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.iterateBytecodesForBlock(BytecodeParser.java:3485)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.handleBytecodeBlock(BytecodeParser.java:3437)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.processBlock(BytecodeParser.java:3282)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.build(BytecodeParser.java:1145)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.buildRootMethod(BytecodeParser.java:1030)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.GraphBuilderPhase$Instance.run(GraphBuilderPhase.java:84)
        at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase.run(SharedGraphBuilderPhase.java:81)
        at jdk.internal.vm.compiler/org.graalvm.compiler.phases.Phase.run(Phase.java:49)
        at jdk.internal.vm.compiler/org.graalvm.compiler.phases.BasePhase.apply(BasePhase.java:212)
        at jdk.internal.vm.compiler/org.graalvm.compiler.phases.Phase.apply(Phase.java:42)
        at jdk.internal.vm.compiler/org.graalvm.compiler.phases.Phase.apply(Phase.java:38)
        at com.oracle.graal.pointsto.flow.AnalysisParsedGraph.parseBytecode(AnalysisParsedGraph.java:132)
        at com.oracle.graal.pointsto.meta.AnalysisMethod.ensureGraphParsed(AnalysisMethod.java:621)
[frontend-0.0.1-RELEASE-runner:21863]      [total]:  26.300,18 ms,  5,47 GB
        at com.oracle.svm.hosted.fieldfolding.StaticFinalFieldFoldingNodePlugin.handleLoadStaticField(StaticFinalFieldFoldingFeature.java:349)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.genGetStatic(BytecodeParser.java:4944)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.genGetStatic(BytecodeParser.java:4911)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.processBytecode(BytecodeParser.java:5413)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.iterateBytecodesForBlock(BytecodeParser.java:3477)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.handleBytecodeBlock(BytecodeParser.java:3437)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.processBlock(BytecodeParser.java:3282)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.build(BytecodeParser.java:1145)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.buildRootMethod(BytecodeParser.java:1030)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.GraphBuilderPhase$Instance.run(GraphBuilderPhase.java:84)
        at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase.run(SharedGraphBuilderPhase.java:81)
        at jdk.internal.vm.compiler/org.graalvm.compiler.phases.Phase.run(Phase.java:49)
        at jdk.internal.vm.compiler/org.graalvm.compiler.phases.BasePhase.apply(BasePhase.java:212)
        at jdk.internal.vm.compiler/org.graalvm.compiler.phases.Phase.apply(Phase.java:42)
        at jdk.internal.vm.compiler/org.graalvm.compiler.phases.Phase.apply(Phase.java:38)
        at com.oracle.graal.pointsto.flow.AnalysisParsedGraph.parseBytecode(AnalysisParsedGraph.java:132)
        at com.oracle.graal.pointsto.meta.AnalysisMethod.ensureGraphParsed(AnalysisMethod.java:621)
        at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.parse(MethodTypeFlowBuilder.java:163)
# Printing build artifacts to: ~/projects/frontend/build/frontend-0.0.1-RELEASE-native-image-source-jar/frontend-0.0.1-RELEASE-runner.build_artifacts.txt
        at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.apply(MethodTypeFlowBuilder.java:321)
        at com.oracle.graal.pointsto.flow.MethodTypeFlow.createTypeFlow(MethodTypeFlow.java:293)
        at com.oracle.graal.pointsto.flow.MethodTypeFlow.ensureTypeFlowCreated(MethodTypeFlow.java:282)
        at com.oracle.graal.pointsto.flow.MethodTypeFlow.addContext(MethodTypeFlow.java:103)
        at com.oracle.graal.pointsto.DefaultAnalysisPolicy$DefaultSpecialInvokeTypeFlow.onObservedUpdate(DefaultAnalysisPolicy.java:363)
        at com.oracle.graal.pointsto.flow.TypeFlow$1.run(TypeFlow.java:449)
        ... 8 more
Caused by: com.oracle.graal.pointsto.constraints.UnresolvedElementException: Discovered unresolved type during parsing: org.apache.logging.log4j.LogManager. To diagnose the issue you can use the --allow-incomplete-classpath option. The missing type is then reported at run time when it is accessed the first time.
        at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.reportUnresolvedElement(SharedGraphBuilderPhase.java:307)
        at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.handleUnresolvedType(SharedGraphBuilderPhase.java:263)
        at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.handleUnresolvedMethod(SharedGraphBuilderPhase.java:289)
        at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.handleUnresolvedInvoke(SharedGraphBuilderPhase.java:252)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.genInvokeStatic(BytecodeParser.java:1677)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.genInvokeStatic(BytecodeParser.java:1652)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.processBytecode(BytecodeParser.java:5419)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.iterateBytecodesForBlock(BytecodeParser.java:3477)
        ... 44 more
Error: Image build request failed with exit status 1
mstahv commented 2 years ago

I fiddled with native compilation a while as well, but couldn't easily get flow-push/atmosphere to work. Getting rid of it completely works, but then, well, there is no server side push... Pushed out my example based on the base starter here:

https://github.com/vaadin/base-starter-flow-quarkus/tree/native-image

mstahv commented 2 years ago

Created an enhancement issue about built-in hints for "native compilation hints": https://github.com/vaadin/quarkus/issues/72

mstahv commented 2 years ago

BTW. I got quite a lot further with flow-push/atmosphere. Requesting runtime initialization for most atmosphere classes gets you forward, but I got frustrated at a point when got complaints about Thread usage. Didn't know anymore what to do with these, without starting to write a replacement/fork for atmosphere framework:

Detailed message:
Error: Detected a started Thread in the image heap. Threads running in the image generator are no longer running at image runtime.  To see how this object got instantiated use --trace-object-instantiation=java.lang.Thread. The object was probably created by a class initializer and is reachable from a static field. You can request class initialization at image runtime by using the option --initialize-at-run-time=<class-name>. Or you can write your own initialization methods and call them explicitly from your main entry point.
Trace: Object was reached by 
        reading field java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.leader of
                constant java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue@58bd40f7 reached by 
        reading field java.util.concurrent.ThreadPoolExecutor.workQueue of
                constant java.util.concurrent.ScheduledThreadPoolExecutor@53a1c99d reached by 
        reading field org.atmosphere.websocket.DefaultWebSocketProcessor.scheduler of
                constant org.atmosphere.websocket.DefaultWebSocketProcessor@777e8193 reached by 
        reading field java.util.WeakHashMap$Entry.value of
                constant java.util.WeakHashMap$Entry@29bd82b3 reached by 
        indexing into array
                constant java.util.WeakHashMap$Entry[]@45534cdd reached by 
        reading field java.util.WeakHashMap.table of
                constant java.util.WeakHashMap@5aa0c751 reached by 
        reading field org.atmosphere.cpr.WebSocketProcessorFactory.processors of
                constant org.atmosphere.cpr.WebSocketProcessorFactory@54d17b5b reached by 
        reading field org.atmosphere.cpr.WebSocketProcessorFactory.factory