Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Quarkus cannot load Truffle/polyglot languages with the custom class loader. #36242

Closed
chumer opened this issue Oct 2, 2023 · 28 comments · Fixed by #37415
Closed

Quarkus cannot load Truffle/polyglot languages with the custom class loader. #36242

chumer opened this issue Oct 2, 2023 · 28 comments · Fixed by #37415
Labels
kind/bug Something isn't working
Milestone

Comments

@chumer
Copy link

chumer commented Oct 2, 2023

Describe the bug

With GraalVM 23.1 (GraalVM for JDK 21) GraalVM Truffle/Polyglot languages are now consumed from the class/module-path.
For context, this project is also known as Truffle Unchained, and we wrote up all about it here: https://medium.com/graalvm/truffle-unchained-13887b77b62c

For that to work we require that the optimizing Truffle runtime runs as a named module. The reason is that we would otherwise need to export the internal JVMCI API to ALL-UNNAMED. The JVMCI is unsafe on steroids and must not be exported like this to preserve VM integrity.

There is no problem with regular Java applications that leverage the module-path or use a module class loader as the truffle runtime runs as named module. As far as I understand Quarkus cannot run modules as named modules atm, therefore this solution cannot be applied. But please correct me if I am wrong.

When running languages from the classpath the Polyglot runtime automatically scans the classpath and looks for modular jar files that it can spawn on a separate module-layer + classloader. This approach typically works for regular Java SE applications, but it fails with the custom Quarkus class loader.

This issue is intended to start a discussion on how we can solve this problem.

Here are a few suggestions/ideas:

  • Create an integration API on our end that Quarkus can integrate into that we can use to enumerate the class path.
  • Quarkus extends the URLClassLoader that Truffle is able to understand enumerate jar files from.
  • Quarkus keeps the System.getProperty("java.class.path") that allows us to spawn our layer.

I discussed this issue with @maxandersen at the GraalVM meetup.

Expected behavior

The page should render without error and no warning should be printed that optimizations are disabled.

Actual behavior

~/g/1/f/embedding-quarkus $ $JAVA_HOME/bin/java -Dpolyglotimpl.TraceClassPathIsolation=true -jar ./target/quarkus-app/quarkus-run.jar
__  ____  __  _____   ___  __ ____  ______
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
2023-10-02 14:09:44,024 INFO  [io.quarkus] (main) embedding 1.0.0-SNAPSHOT on JVM (powered by Quarkus 3.4.1) started in 0.382s. Listening on: http://0.0.0.0:8080
2023-10-02 14:09:44,026 INFO  [io.quarkus] (main) Profile prod activated.
2023-10-02 14:09:44,026 INFO  [io.quarkus] (main) Installed features: [cdi, resteasy-reactive, smallrye-context-propagation, vertx]
[class-path-isolation] Start polyglot class-path isolation
[class-path-isolation] Collected 1 class-path entries from java.class.path system property
[class-path-isolation] Class-path entry: ./target/quarkus-app/quarkus-run.jar
[class-path-isolation] No truffle-api and/or polyglot found on classpath.
2023-10-02 14:10:09,738 ERROR [io.qua.ver.htt.run.QuarkusErrorHandler] (executor-thread-1) HTTP Request to /hello failed, error id: 794662c0-106c-4404-a176-d7c04c4a0e50-1: java.lang.IllegalStateException: No language and polyglot implementation was found on the class-path. Make sure at last one language is added on the class-path. If you put a language on the class-path and you encounter this error then there could be a problem with isolated class loading. Use -Dpolyglotimpl.TraceClassPathIsolation=true to debug class loader islation problems. For best performance it is recommended to use polyglot from the module-path instead of the class-path.
	at org.graalvm.polyglot.Engine$PolyglotInvalid.noPolyglotImplementationFound(Engine.java:2071)
	at org.graalvm.polyglot.Engine$PolyglotInvalid.createHostAccess(Engine.java:2057)
	at org.graalvm.polyglot.Engine$PolyglotInvalid.createHostAccess(Engine.java:2023)
	at org.graalvm.polyglot.Engine$Builder.build(Engine.java:753)
	at org.graalvm.polyglot.Context$Builder.build(Context.java:1925)
	at org.graalvm.polyglot.Context.create(Context.java:979)
	at org.quarkus.GreetingResource.hello(GreetingResource.java:15)
	at org.quarkus.GreetingResource$quarkusrestinvoker$hello_e747664148511e1e5212d3e0f4b40d45c56ab8a1.invoke(Unknown Source)
	at org.jboss.resteasy.reactive.server.handlers.InvocationHandler.handle(InvocationHandler.java:29)
	at io.quarkus.resteasy.reactive.server.runtime.QuarkusResteasyReactiveRequestContext.invokeHandler(QuarkusResteasyReactiveRequestContext.java:141)
	at org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext.run(AbstractResteasyReactiveContext.java:147)
	at io.quarkus.vertx.core.runtime.VertxCoreRecorder$14.runWith(VertxCoreRecorder.java:582)
	at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)
	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)
	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:1583)

There is a second issue if you uncomment the test code in the attached test project and run mvn package you get:

[ERROR] Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 2.935 s <<< FAILURE! -- in org.quarkus.GreetingResourceTest
[ERROR] org.quarkus.GreetingResourceTest.testHelloEndpoint -- Time elapsed: 0.713 s <<< FAILURE!
java.lang.AssertionError:
1 expectation failed.
Expected status code <200> but was <500>.

	at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486)
	at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:73)
	at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:108)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:57)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:263)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:277)
	at io.restassured.internal.ResponseSpecificationImpl$HamcrestAssertionClosure.validate(ResponseSpecificationImpl.groovy:512)
	at io.restassured.internal.ResponseSpecificationImpl$HamcrestAssertionClosure$validate$1.call(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:139)
	at io.restassured.internal.ResponseSpecificationImpl.validateResponseIfRequired(ResponseSpecificationImpl.groovy:696)
	at io.restassured.internal.ResponseSpecificationImpl.this$2$validateResponseIfRequired(ResponseSpecificationImpl.groovy)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.codehaus.groovy.runtime.callsite.PlainObjectMetaMethodSite.doInvoke(PlainObjectMetaMethodSite.java:43)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:198)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:62)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:171)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:185)
	at io.restassured.internal.ResponseSpecificationImpl.statusCode(ResponseSpecificationImpl.groovy:135)
	at io.restassured.specification.ResponseSpecification$statusCode$0.callCurrent(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:171)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:185)
	at io.restassured.internal.ResponseSpecificationImpl.statusCode(ResponseSpecificationImpl.groovy:143)
	at io.restassured.internal.ValidatableResponseOptionsImpl.statusCode(ValidatableResponseOptionsImpl.java:89)
	at org.quarkus.GreetingResourceTest.testHelloEndpoint(GreetingResourceTest.java:18)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at io.quarkus.test.junit.QuarkusTestExtension.runExtensionMethod(QuarkusTestExtension.java:1015)
	at io.quarkus.test.junit.QuarkusTestExtension.interceptTestMethod(QuarkusTestExtension.java:829)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:103)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:93)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
	at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:156)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:147)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:86)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:103)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:93)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:92)
	at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:86)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:217)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:213)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:138)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:68)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:147)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:127)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:90)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:55)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:102)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:54)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86)
	at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86)
	at org.apache.maven.surefire.junitplatform.LazyLauncher.execute(LazyLauncher.java:56)
	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.execute(JUnitPlatformProvider.java:184)
	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:148)
	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:122)
	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
	at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
	at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)
	Suppressed: java.lang.InternalError: java.lang.reflect.InvocationTargetException
		at org.graalvm.polyglot.Engine$ClassPathIsolation.createIsolatedTruffle(Engine.java:1756)
		at org.graalvm.polyglot.Engine$1.searchServiceLoader(Engine.java:1682)
		at org.graalvm.polyglot.Engine$1.run(Engine.java:1668)
		at org.graalvm.polyglot.Engine$1.run(Engine.java:1663)
		at java.base/java.security.AccessController.doPrivileged(AccessController.java:319)
		at org.graalvm.polyglot.Engine.initEngineImpl(Engine.java:1663)
		at org.graalvm.polyglot.Engine$ImplHolder.<clinit>(Engine.java:186)
		at org.graalvm.polyglot.Engine.getImpl(Engine.java:438)
		at org.graalvm.polyglot.Engine$Builder.build(Engine.java:736)
		at org.graalvm.polyglot.Context$Builder.build(Context.java:1925)
		at org.graalvm.polyglot.Context.create(Context.java:979)
		at org.quarkus.GreetingResource.hello(GreetingResource.java:15)
		at org.quarkus.GreetingResource$quarkusrestinvoker$hello_e747664148511e1e5212d3e0f4b40d45c56ab8a1.invoke(Unknown Source)
		at org.jboss.resteasy.reactive.server.handlers.InvocationHandler.handle(InvocationHandler.java:29)
		at io.quarkus.resteasy.reactive.server.runtime.QuarkusResteasyReactiveRequestContext.invokeHandler(QuarkusResteasyReactiveRequestContext.java:141)
		at org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext.run(AbstractResteasyReactiveContext.java:147)
		at io.quarkus.vertx.core.runtime.VertxCoreRecorder$14.runWith(VertxCoreRecorder.java:582)
		at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)
		at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)
		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:1583)
	Caused by: java.lang.reflect.InvocationTargetException
		at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118)
		at java.base/java.lang.reflect.Method.invoke(Method.java:580)
		at org.graalvm.polyglot.Engine$ClassPathIsolation.createIsolatedTruffle(Engine.java:1753)
		... 22 more
	Caused by: java.lang.IllegalAccessError: superinterface check failed: class com.oracle.truffle.runtime.hotspot.libgraal.LibGraalTruffleCompilationSupport (in module org.graalvm.truffle.runtime) cannot access class com.oracle.truffle.compiler.TruffleCompilationSupport (in unnamed module @0x455cbf18) because module org.graalvm.truffle.runtime does not read unnamed module @0x455cbf18
		at java.base/java.lang.ClassLoader.defineClass1(Native Method)
		at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1027)
		at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1105)
		at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:182)
		at java.base/jdk.internal.loader.Loader.defineClass(Loader.java:612)
		at java.base/jdk.internal.loader.Loader.lambda$findClassInModuleOrNull$6(Loader.java:589)
		at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
		at java.base/jdk.internal.loader.Loader.findClassInModuleOrNull(Loader.java:590)
		at java.base/jdk.internal.loader.Loader.loadClass(Loader.java:548)
		at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
		at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.hotspot.HotSpotTruffleRuntimeAccess.createRuntime(HotSpotTruffleRuntimeAccess.java:113)
		at org.graalvm.truffle.runtime/com.oracle.truffle.runtime.hotspot.HotSpotTruffleRuntimeAccess.getRuntime(HotSpotTruffleRuntimeAccess.java:64)
		at org.graalvm.truffle/com.oracle.truffle.api.Truffle.createRuntime(Truffle.java:142)
		at org.graalvm.truffle/com.oracle.truffle.api.Truffle$1.run(Truffle.java:173)
		at org.graalvm.truffle/com.oracle.truffle.api.Truffle$1.run(Truffle.java:171)
		at java.base/java.security.AccessController.doPrivileged(AccessController.java:319)
		at org.graalvm.truffle/com.oracle.truffle.api.Truffle.initRuntime(Truffle.java:171)
		at org.graalvm.truffle/com.oracle.truffle.api.Truffle.<clinit>(Truffle.java:63)
		at com.oracle.truffle.enterprise/com.oracle.truffle.runtime.enterprise.EnterpriseTruffle.G(stripped:21)
		at com.oracle.truffle.enterprise/com.oracle.truffle.polyglot.enterprise.EnterprisePolyglotImpl.getPriority(stripped:496)
		at java.base/java.util.Comparator.lambda$comparing$77a9974f$1(Comparator.java:473)
		at java.base/java.util.TimSort.countRunAndMakeAscending(TimSort.java:355)
		at java.base/java.util.TimSort.sort(TimSort.java:220)
		at java.base/java.util.Arrays.sort(Arrays.java:1308)
		at java.base/java.util.ArrayList.sort(ArrayList.java:1804)
		at java.base/java.util.Collections.sort(Collections.java:178)
		at org.graalvm.polyglot/org.graalvm.polyglot.Engine.loadAndValidateProviders(Engine.java:1632)
		at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
		... 24 more

I think what is going on is that the the truffle-compiler.jar that already ships as part of the GraalVM JDK is loaded with the Quarkus classloader.

How to Reproduce?

  1. Download and unpack: embedding-quarkus.zip

  2. Download and unpack GraalVM for JDK 21 and set your JAVA_HOME to it.

  3. Run: mvn quarkus:dev

  4. Open http://0.0.0.0:8080/hello

To reproduce the second issue uncomment the code in GreetingResourceTest and run mvn package.

Output of uname -a or ver

Darwin christianhumer-mac 22.6.0 Darwin Kernel Version 22.6.0: Wed Jul 5 22:22:05 PDT 2023; root:xnu-8796.141.3~6/RELEASE_ARM64_T6000 arm64

Output of java -version

java version "21" 2023-09-19 Java(TM) SE Runtime Environment Oracle GraalVM 21+35.1 (build 21+35-jvmci-23.1-b15) Java HotSpot(TM) 64-Bit Server VM Oracle GraalVM 21+35.1 (build 21+35-jvmci-23.1-b15, mixed mode, sharing)

GraalVM version (if different from Java)

23.1 / GraalVM for JDK 21

Quarkus version or git rev

3.4.1

Build tool (ie. output of mvnw --version or gradlew --version)

Maven home: /opt/homebrew/Cellar/maven/3.9.4/libexec Java version: 21, vendor: Oracle Corporation, runtime: /Users/christianhumer/graal/graalvm/graalvm-ee-java21-23.1.0 Default locale: en_CH, platform encoding: UTF-8 OS name: "mac os x", version: "13.5.2", arch: "aarch64", family: "mac"

Additional information

Related micronaut issue: micronaut-projects/micronaut-maven-plugin#866

@chumer chumer added the kind/bug Something isn't working label Oct 2, 2023
@chumer chumer changed the title Quarkus cannot load Truffle/polyglot languages on HotSpot because of the Quarkus class loader. Quarkus cannot load Truffle/polyglot languages with the custom class loader. Oct 2, 2023
@gsmet
Copy link
Member

gsmet commented Oct 6, 2023

@stuartwdouglas @geoand that might be of interest to you.

@maxandersen
Copy link
Member

@chumer does this only occur on graalvm JDK where the "duplicate" truffle jar is present?

@geoand
Copy link
Contributor

geoand commented Oct 9, 2023

Thanks for the detailed report, much appreciated!

From the options presented, I think that only 1 is possible for our case.

Let's also include @zakkak here

@zakkak
Copy link
Contributor

zakkak commented Oct 10, 2023

Just a clarification on my side. The above are only concerning JVM-mode. When it comes to native-mode we expect more roadblocks as Mandrel still doesn't support truffle. We explored the option of adding the truffle svm runtime in Mandrel but there are some packaging issues that still prevent us from doing so.

@chumer
Copy link
Author

chumer commented Oct 10, 2023

@zakkak I've commented here graalvm/mandrel-packaging#369 (comment) on how to enable Truffle languages for Mandrel native-image builds.

@chumer
Copy link
Author

chumer commented Oct 10, 2023

Maybe someone has more ideas for other workarounds as an integration API probably will take a bit? I know for example Spring Boot has an option to disable custom class-loading for deployments. For testing I guess regular class-path already works, but there seems to be another probably unrelated issue (that might also be an issue on our end).

@geoand
Copy link
Contributor

geoand commented Oct 11, 2023

I will have a look soon and let you know if there are any quick ways around the problem in the current state.

@maxandersen
Copy link
Member

@chumer does this only occur on graalvm JDK where the "duplicate" truffle jar is present?

reason i'm asking is if the issue is the duplicate jar then marking the truffle jar as provided when running on graalvm would be an option?

@geoand
Copy link
Contributor

geoand commented Oct 11, 2023

@chumer when things work properly, where does the truffle module needed in:

            for (ParsedModule parsedModule : parsedModules) {
                for (ModuleReference m : parsedModule.modules()) {
                    String name = m.descriptor().name();
                    switch (name) {
                        case TRUFFLE_MODULE_NAME:
                        case POLYGLOT_MODULE_NAME:
                            includedModules.add(name);
                            break;
                    }
                    if (includedModules.size() == 2) {
                        // found truffle and polyglot
                        break;
                    }
                }
            }

come from?

@chumer
Copy link
Author

chumer commented Oct 11, 2023

when things work properly, where does the truffle module needed in come from?

@geoand from the JVM class-path. To be more precise like this:

        private static List<Path> collectClassPathJars(ClassLoader cl) {
            List<Path> paths = new ArrayList<>();
            if (cl instanceof URLClassLoader) {
                URLClassLoader urlClassLoader = (URLClassLoader) cl;
                for (URL url : urlClassLoader.getURLs()) {
                    try {
                        paths.add(Path.of(url.toURI().getPath()));
                    } catch (URISyntaxException e) {
                        // ignore invalid syntax
                    }
                }
                if (TRACE_CLASS_PATH_ISOLATION) {
                    trace("Collected %s class-path entries from URLClassloader", paths.size());
                }

            } else if (System.getProperty("java.class.path") != null) {
                String classpath = System.getProperty("java.class.path");
                String[] classpathEntries = classpath.split(File.pathSeparator);
                for (String entry : classpathEntries) {
                    paths.add(Paths.get(entry));
                }
                if (TRACE_CLASS_PATH_ISOLATION) {
                    trace("Collected %s class-path entries from java.class.path system property", paths.size());
                }
            } else {
                trace("Could not resolve class-path entries from environment. The class-path isolation only supports URLClassLoader and the java.class.path system property. " +
                                "If you are using a custom class loader use a URLClassLoader base class or set the java.class.path system property to allow scanning of class-path entries.");
            }
            return paths;
        }

The else branch could be used for an integration API. If truffle is already on the module-path this code does not trigger. So I think the easiest way to resolve this problem is to just use the JVM class-path like I think you do when you run Quarkus tests.

@geoand
Copy link
Contributor

geoand commented Oct 11, 2023

Thanks for the details.

But in the reproducer you provided I don't see any truffle dependencies so I don't understand how the truffle jar would be found on the classpath (if things were working propertly in Quarkus)

@chumer
Copy link
Author

chumer commented Oct 11, 2023

@geoand mvn dependency:tree shows it:

[INFO] +- org.graalvm.polyglot:js:pom:23.1.0:compile
[INFO] |  +- org.graalvm.polyglot:js-community:pom:23.1.0:runtime
[INFO] |  |  +- org.graalvm.js:js-language:jar:23.1.0:runtime
[INFO] |  |  |  +- org.graalvm.regex:regex:jar:23.1.0:runtime
[INFO] |  |  |  +- org.graalvm.truffle:truffle-api:jar:23.1.0:runtime
[INFO] |  |  |  \- org.graalvm.shadowed:icu4j:jar:23.1.0:runtime
[INFO] |  |  \- org.graalvm.truffle:truffle-runtime:jar:23.1.0:runtime
[INFO] |  \- org.graalvm.truffle:truffle-enterprise:jar:23.1.0:runtime
[INFO] |     +- org.graalvm.truffle:truffle-compiler:jar:23.1.0:runtime
[INFO] |     +- org.graalvm.sdk:jniutils:jar:23.1.0:runtime
[INFO] |     \- org.graalvm.sdk:nativebridge:jar:23.1.0:runtime

@chumer
Copy link
Author

chumer commented Oct 11, 2023

The other error besides class-path isolation can be reproduced by running mvn package. mvn quarkus:test does not work due to the class loader again.

This is the workaround for the js dependency to make it work with mvn package:

    <dependency>
      <groupId>org.graalvm.polyglot</groupId>
      <artifactId>js</artifactId>
      <version>${graalvm.version}</version>
      <type>pom</type>
      <exclusions>
        <exclusion>
          <groupId>org.graalvm.truffle</groupId>
          <artifactId>truffle-compiler</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>

@geoand
Copy link
Contributor

geoand commented Oct 11, 2023

Ah sorry, I missed that in the dependency tree.

So I do have a very rough scetch of a hack to make this kind of work... (notice how many qualifying words I added there :))
We would essentially set java.class.path under the hood. The problem is that it needs to be done for each mode Quarkus supports but I manually tested that it works...

@chumer
Copy link
Author

chumer commented Oct 11, 2023

We would essentially set java.class.path under the hood. The problem is that it needs to be done for each mode Quarkus supports but I manually tested that it works...

That is an interesting idea indeed. I was hoping for a solution like this. Let me know if I can help.

@geoand
Copy link
Contributor

geoand commented Oct 11, 2023

I think I'll be able to find some time to get it in Quarkus 3.5.0

@chumer
Copy link
Author

chumer commented Oct 11, 2023

That is great news! thanks.

Side note: I think it could be interesting how this behaves with Quarkus reloading. The optimizing truffle runtime can only be loaded once per JVM and currently fails if you try to load it in a second class loader. So I'd expect it to fail if you reload it with Quarkus depending on which granularity reloading works. It's a limitation we can likely fix on our end, would just be curious whether it triggers.

@geoand
Copy link
Contributor

geoand commented Oct 11, 2023

Good point! I'll have to see how it behaves

@alukin
Copy link
Contributor

alukin commented Oct 29, 2023

I tried to embedd JS with Quarkus 3.5.0 and GraalVM 21.0.1 and resuals are the same.
I should note, that using module-info.java with "requires org.graalvm.polyglot;" is required by this new implementation of
Graal VM JS. The example code from the Graal documentation does not work without it.

@geoand
Copy link
Contributor

geoand commented Oct 29, 2023

Sorry I wasn't able to get to this. Hopefully soon

@geoand
Copy link
Contributor

geoand commented Nov 23, 2023 via email

geoand added a commit to geoand/quarkus that referenced this issue Nov 24, 2023
@geoand
Copy link
Contributor

geoand commented Nov 24, 2023

I have something working from prod mode, but dev-mode needs more thought...

@geoand
Copy link
Contributor

geoand commented Nov 24, 2023

@chumer is truffle expected to work in a native-image application?

@geoand
Copy link
Contributor

geoand commented Nov 26, 2023

There is actually an easier and more general way to fix this than what I posted above - I'll try and get a PR next week but can't make any promises because I'm traveling

@zakkak
Copy link
Contributor

zakkak commented Nov 27, 2023

@chumer is truffle expected to work in a native-image application?

Not @chumer, but yes AFAIK truffle works in native-image applications. Note however that we don't support it in Mandrel.

@geoand
Copy link
Contributor

geoand commented Nov 27, 2023

Gotcha, thanks.

The fix I have in mind should Just Work in all cases

@geoand
Copy link
Contributor

geoand commented Nov 30, 2023

#37415 is what I have in mind

gsmet added a commit that referenced this issue Nov 30, 2023
Make Truffle from GraalVM 23.1 work in all Quarkus modes
@quarkus-bot quarkus-bot bot added this to the 3.7 - main milestone Nov 30, 2023
@gsmet gsmet modified the milestones: 3.7 - main, 3.6.1 Dec 1, 2023
gsmet pushed a commit to gsmet/quarkus that referenced this issue Dec 1, 2023
benkard pushed a commit to benkard/mulkcms2 that referenced this issue Dec 23, 2023
This MR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [flow-bin](https://github.com/flowtype/flow-bin) ([changelog](https://github.com/facebook/flow/blob/master/Changelog.md)) | devDependencies | minor | [`^0.223.0` -> `^0.224.0`](https://renovatebot.com/diffs/npm/flow-bin/0.223.0/0.224.0) |
| [org.postgresql:postgresql](https://jdbc.postgresql.org) ([source](https://github.com/pgjdbc/pgjdbc)) | build | patch | `42.7.0` -> `42.7.1` |
| [net.java.dev.jna:jna](https://github.com/java-native-access/jna) | compile | minor | `5.13.0` -> `5.14.0` |
| [org.hibernate.orm:hibernate-envers](https://hibernate.org/orm) ([source](https://github.com/hibernate/hibernate-orm)) | build | patch | `6.4.0.Final` -> `6.4.1.Final` |
| [org.hibernate.orm:hibernate-core](https://hibernate.org/orm) ([source](https://github.com/hibernate/hibernate-orm)) | build | patch | `6.4.0.Final` -> `6.4.1.Final` |
| [com.diffplug.spotless:spotless-maven-plugin](https://github.com/diffplug/spotless) | build | patch | `2.41.0` -> `2.41.1` |
| [io.quarkus:quarkus-maven-plugin](https://github.com/quarkusio/quarkus) | build | patch | `3.6.0` -> `3.6.3` |
| [io.quarkus:quarkus-universe-bom](https://github.com/quarkusio/quarkus-platform) | import | patch | `3.6.0` -> `3.6.3` |

---

### Release Notes

<details>
<summary>flowtype/flow-bin</summary>

### [`v0.224.0`](flow/flow-bin@e730887...e6104a1)

[Compare Source](flow/flow-bin@e730887...e6104a1)

### [`v0.223.3`](flow/flow-bin@6e1e3f7...e730887)

[Compare Source](flow/flow-bin@6e1e3f7...e730887)

### [`v0.223.2`](flow/flow-bin@5bb7bcf...6e1e3f7)

[Compare Source](flow/flow-bin@5bb7bcf...6e1e3f7)

</details>

<details>
<summary>pgjdbc/pgjdbc</summary>

### [`v42.7.1`](https://github.com/pgjdbc/pgjdbc/blob/HEAD/CHANGELOG.md#&#8203;4271-2023-12-06-083400--0500)

##### Changed

-   perf: improve performance of PreparedStatement.setBlob, BlobInputStream, and BlobOutputStream with dynamic buffer sizing [MR #&#8203;3044](pgjdbc/pgjdbc#3044)

##### Fixed

-   fix: Apply connectTimeout before SSLSocket.startHandshake to avoid infinite wait in case the connection is broken [MR #&#8203;3040](pgjdbc/pgjdbc#3040)
-   fix: support waffle-jna 2.x and 3.x by using reflective approach for ManagedSecBufferDesc [MR #&#8203;2720](pgjdbc/pgjdbc#2720) Fixes [Issue #&#8203;2690](pgjdbc/pgjdbc#2720).
-   fix: NoSuchMethodError on ByteBuffer#position When Running on Java 8  when accessing arrays, fixes [Issue #&#8203;3014](pgjdbc/pgjdbc#3014)
-   Revert "[MR #&#8203;2925](pgjdbc/pgjdbc#2925) Use canonical DateStyle name" [MR #&#8203;3035](pgjdbc/pgjdbc#3035)
    Fixes  [Issue #&#8203;3008](pgjdbc/pgjdbc#3008)
-   Revert "[MR ##&#8203;2973](pgjdbc/pgjdbc#2973) feat: support SET statements combining with other queries with semicolon in PreparedStatement" [MR #&#8203;3010](pgjdbc/pgjdbc#3010)
    Fixes [Issue #&#8203;3007](pgjdbc/pgjdbc#3007)
-   fix: avoid timezone conversions when sending LocalDateTime to the database [#&#8203;2852](pgjdbc/pgjdbc#3010)  Fixes [Issue #&#8203;1390](pgjdbc/pgjdbc#1390)
    ,[Issue #&#8203;2850](pgjdbc/pgjdbc#2850)
    Closes \[Issue [#&#8203;1391](pgjdbc/pgjdbc#1391)

</details>

<details>
<summary>java-native-access/jna</summary>

### [`v5.14.0`](https://github.com/java-native-access/jna/blob/HEAD/CHANGES.md#Release-5140)

[Compare Source](java-native-access/jna@5.13.0...5.14.0)

\==============

## Features

-   [#&#8203;1556](java-native-access/jna#1556): Add `SetJob`, `SetPrinter` to `c.s.j.p.w.Winspool` - [@&#8203;tresf](https://github.com/tresf).
-   [#&#8203;1534](java-native-access/jna#1534): Add `GetMethod`, `Put`, `SpawnInstance` to `c.s.j.p.win32.COM.WbemCli#IWbemClassObject` and `ExecMethod` to `c.s.j.p.win32.COM.WbemCli#IWbemServices` - [@&#8203;faddom](https://github.com/faddom).
-   [#&#8203;1544](java-native-access/jna#1544): Add `GetPriorityClass`, `SetPriorityClass`, `GetThreadPriority`, `SetThreadPriority` and associated constants to `c.s.j.p.win32.Kernel32` - [@&#8203;dEajL3kA](https://github.com/dEajL3kA).
-   [#&#8203;1548](java-native-access/jna#1548): Make interface `c.s.j.p.mac.XAttr public` - [@&#8203;matthiasblaesing](https://github.com/matthiasblaesing).
-   [#&#8203;1551](java-native-access/jna#1551): Add `c.s.j.p.bsd.ExtAttr` and `c.s.j.p.bsd.ExtAttrUtil` to wrap BSD [\<sys/extattr.h>](https://man.freebsd.org/cgi/man.cgi?query=extattr\&sektion=2) system calls. [@&#8203;rednoah](https://github.com/rednoah).
-   [#&#8203;1517](java-native-access/jna#1517): Add missing `O_*` (e.g. `O_APPEND`, `O_SYNC`, `O_DIRECT`, ...) to `c.s.j.p.linux.Fcntl` - [@&#8203;matthiasblaesing](https://github.com/matthiasblaesing).
-   [#&#8203;1521](java-native-access/jna#1521): Shutdown CleanerThread once the last cleanable is removed - [@&#8203;matthiasblaesing](https://github.com/matthiasblaesing).
-   [#&#8203;1557](java-native-access/jna#1557): Build linux-riscv64 on Ubuntu focal to improve compatibility with older glibc versions - [@&#8203;matthiasblaesing](https://github.com/matthiasblaesing).

## Bug Fixes

-   [#&#8203;1501](java-native-access/jna#1501): `Library.OPTION_STRING_ENCODING` is ignore for string arguments function calls - [@&#8203;matthiasblaesing](https://github.com/matthiasblaesing).
-   [#&#8203;1504](java-native-access/jna#1504): Increase maximum supported fixed args on varargs calls from 3 to 255 - [@&#8203;andrew-nowak](https://github.com/andrew-nowak).
-   [#&#8203;1545](java-native-access/jna#1545): Fix Java 6 incompatibility in `c.s.j.p.win32.Kerne32Util` and `c.s.j.p.win32.DBT` - [@&#8203;matthiasblaesing](https://github.com/matthiasblaesing).

## Important Changes

-   The interfaces between Java and native code have changed, so `libjnidispatch`
    must be rebuilt to be compatible with this release.
-   Release drops support for JDKs 6 + 7, so you'll need at least JDK 8 to
    update to use this version.

</details>

<details>
<summary>hibernate/hibernate-orm</summary>

### [`v6.4.1.Final`](https://github.com/hibernate/hibernate-orm/blob/HEAD/changelog.txt#Changes-in-641Final-December-15-2023)

[Compare Source](hibernate/hibernate-orm@6.4.0...6.4.1)

https://hibernate.atlassian.net/projects/HHH/versions/32216

\*\* Bug
\* \[HHH-17570] - Wrong name provided when checking Oracle autonomous JSON database
\* \[HHH-17561] - NullPointerException at OracleServerConfiguration class
\* \[HHH-17555] - equals hashcode combined with naturalId
\* \[HHH-17553] - java.util.ConcurrentModificationException: null when loading an entity
\* \[HHH-17551] - Gradle Enterprise improvements
\* \[HHH-17528] - Explicit selection of an [@&#8203;Embeddable](https://github.com/Embeddable) property containing associated collections doesn't work
\* \[HHH-17525] - StackOverflowError when using [@&#8203;ManyToMany](https://github.com/ManyToMany) with composite id
\* \[HHH-17520] - Schema creation fails with interval second data type on PostgreSQL
\* \[HHH-17519] - Initializing a lazy association with a non aggregate id causes a NPE
\* \[HHH-17515] - DynamicInstantiationResult wrong java type constructor selected
\* \[HHH-17499] - SemanticException when querying embedded id entity with positional parameter
\* \[HHH-17494] - Metamodel generator produces an uncompilable class when an EntityGraph name contains a comma
\* \[HHH-17491] - UnknownEntityTypeException thrown when multiple subclasses define an attribute with the same name and one is a MappedSuperclass
\* \[HHH-17489] - ConcurrentModificationException after upgrading to 6.4.0
\* \[HHH-17466] - Exception on query: Could not convert 'java.util.Locale' to 'java.util.Locale' using 'org.hibernate.type.descriptor.java.LocaleJavaType' to wrap
\* \[HHH-17464] - 6.4.0 regression: NullPointerException in DefaultEvictEventListener#onEvict
\* \[HHH-17456] - java.util.UnknownFormatConversionException thrown why logging set to TRACE
\* \[HHH-17445] - Subquery correlated path expressions do not work with nullness predicates
\* \[HHH-17418] - Bytecode enchanced read accessor for a final field uses "missing" writer method
\* \[HHH-17416] - Using tuples in WHERE clause throws SemanticException
\* \[HHH-17413] - Invalid SQL with TYPE() function and CASE expression in SELECT clause
\* \[HHH-17408] - Unproxying leads to uninitialized one-to-one associations in some cases involving polymorphism
\* \[HHH-17407] - AssertionError when using JpaEntityJoin with correlated subqery if criteria copy tree is enabled
\* \[HHH-17405] - Cannot resolve path of generic mapped-superclass association path
\* \[HHH-17402] - UnknownEntityTypeException: Unable to locate persister - when comparing generic interface ToOne attribute to parameter
\* \[HHH-17397] - Count with right join returns count on the left entity although requested by the right one
\* \[HHH-17395] - Refresh with PESSIMISTIC_WRITE ignored for lazy loaded entity
\* \[HHH-17393] - Incorrect return type for List attribute, wrap in additional list
\* \[HHH-17392] - UnsupportedOperationException when using row_number() window function without top level GROUP BY
\* \[HHH-17391] - AssertionError when using row_number() window function with ORDER BY
\* \[HHH-17387] - Can't use EAGER ManyToOne on parent abstract class of joined table entity
\* \[HHH-17379] - Right join does not return records from the right table if there is condition on ID field and there's no matching record in the from clause
\* \[HHH-17359] - Query Cache contains null values for entity associations when entity was already loaded
\* \[HHH-17334] - Duplicated columns when updating indexed [@&#8203;ElementCollection](https://github.com/ElementCollection) with non updatable fields
\* \[HHH-17293] - Schema validation fails on postgres interval seconds type
\* \[HHH-17280] - UnknownTableReferenceException in subquery selecting embeddable foreign key
\* \[HHH-16967] - Missing join on inheritance parent table to validate [@&#8203;Where](https://github.com/Where) condition
\* \[HHH-16756] - orphanRemoval does not work when bytecode enhancement is enabled
\* \[HHH-16306] - CountExpressionTest.testCountDistinctTuple fails on Sybase
\* \[HHH-16100] - Dynamic-map entity mode does not register a column for one-to-one associations
\* \[HHH-1645] - refresh with LockMode on an unitialized proxy does not work

\*\* Improvement
\* \[HHH-17554] - No join on the table of the parent class with JOINED inheritance strategy when the select not contains a column used in [@&#8203;Where](https://github.com/Where) or [@&#8203;SQLRestriction](https://github.com/SQLRestriction)
\* \[HHH-16809] - Add JavaType#createArray

\*\* Task
\* \[HHH-17565] - Add testing for JDK 22-ea
\* \[HHH-17546] - Update Cockroach CI testing to 23.1.12
\* \[HHH-17545] - Update SAP HANA JDBC driver to 2.19.11
\* \[HHH-17544] - Update SAP HANA CI testing to 2.00.072.00.20231123.1
\* \[HHH-17543] - Update DB2 CI testing to 11.5.9.0
\* \[HHH-17542] - Update DB2 JDBC driver to 11.5.9.0
\* \[HHH-17541] - Update SQL Server JDBC driver to 12.4.2

</details>

<details>
<summary>quarkusio/quarkus</summary>

### [`v3.6.3`](https://github.com/quarkusio/quarkus/releases/tag/3.6.3)

[Compare Source](quarkusio/quarkus@3.6.2...3.6.3)

##### Complete changelog

-   [#&#8203;37690](quarkusio/quarkus#37690) - Regression in 3.6.2: ConfigDiagnostic `NullPointerException: Cannot invoke "java.lang.CharSequence.toString()" because "s" is null`
-   [#&#8203;37688](quarkusio/quarkus#37688) - Do not use build cache when releasing
-   [#&#8203;37669](quarkusio/quarkus#37669) - OIDC: Fix DEV UI startup when OIDC or Keycloak Dev Services is disabled
-   [#&#8203;37667](quarkusio/quarkus#37667) - Disabling of Dev Services for Keycloak leads to startup error
-   [#&#8203;37651](quarkusio/quarkus#37651) - Fix GraalVM version checker in order to accept other implementations
-   [#&#8203;37563](quarkusio/quarkus#37563) - Consistent file URI for folders and jars
-   [#&#8203;37559](quarkusio/quarkus#37559) - Quarkus throws NPE when trying to match unknown config files

### [`v3.6.2`](https://github.com/quarkusio/quarkus/releases/tag/3.6.2)

[Compare Source](quarkusio/quarkus@3.6.1...3.6.2)

##### Complete changelog

-   [#&#8203;37686](quarkusio/quarkus#37686) - Use standard URL when updating the website
-   [#&#8203;37653](quarkusio/quarkus#37653) - Improve error message in REST Client when no matching readers found
-   [#&#8203;37640](quarkusio/quarkus#37640) - Handle expireAfterWrite properly in the redis-cache config
-   [#&#8203;37639](quarkusio/quarkus#37639) - Logging docs include build time config reference
-   [#&#8203;37638](quarkusio/quarkus#37638) - Add scope tag to all injected MP Metrics
-   [#&#8203;37623](quarkusio/quarkus#37623) - Add quarkus-funqy-amazon-lambda-deployment to the quarkus-bom
-   [#&#8203;37617](quarkusio/quarkus#37617) - SmallRye GraphQL 2.6.1
-   [#&#8203;37611](quarkusio/quarkus#37611) - Fix configuration of custom port for Elasticsearch dev services
-   [#&#8203;37610](quarkusio/quarkus#37610) - Elasticsearch devservice port incorrect binding
-   [#&#8203;37605](quarkusio/quarkus#37605) - Fix type in HeartbeatFilter example of rest-client-reactive doc
-   [#&#8203;37599](quarkusio/quarkus#37599) - Bump kafka3.version from 3.6.0 to 3.6.1
-   [#&#8203;37594](quarkusio/quarkus#37594) - Bump org.jetbrains.kotlinx:kotlinx-serialization-json from 1.6.1 to 1.6.2
-   [#&#8203;37590](quarkusio/quarkus#37590) - Microprofile Metric Missing "Scope" Tag Only When Using Constructor Injection
-   [#&#8203;37588](quarkusio/quarkus#37588) - Update the import.cypher script to use newer syntax
-   [#&#8203;37581](quarkusio/quarkus#37581) - Support using commas to add extensions with CLI
-   [#&#8203;37570](quarkusio/quarkus#37570) - Prevent concurrently running Jacoco ReportCreators to avoid report corruption
-   [#&#8203;37565](quarkusio/quarkus#37565) - ArC: prevent duplicate bean discovery & detect duplicate bean identifiers
-   [#&#8203;37564](quarkusio/quarkus#37564) - Invalid documentation for 'quarkus extension add'
-   [#&#8203;37557](quarkusio/quarkus#37557) - Make docs/sync-web-site.sh recoverable
-   [#&#8203;37553](quarkusio/quarkus#37553) - Register OpenAPI custom filters for reflection
-   [#&#8203;37549](quarkusio/quarkus#37549) - Bump commons-io:commons-io from 2.15.0 to 2.15.1
-   [#&#8203;37546](quarkusio/quarkus#37546) - Bump io.quarkus:quarkus-platform-bom-maven-plugin from 0.0.99 to 0.0.100
-   [#&#8203;37545](quarkusio/quarkus#37545) - Bump org.junit.jupiter:junit-jupiter from 5.10.0 to 5.10.1
-   [#&#8203;37536](quarkusio/quarkus#37536) - Fix != expression in `@PreAuthorize` check
-   [#&#8203;37535](quarkusio/quarkus#37535) - Fix Snappy note about native
-   [#&#8203;37526](quarkusio/quarkus#37526) - Spring security annotatiton PreAuthorize process equals and not equals in the same way
-   [#&#8203;37520](quarkusio/quarkus#37520) - Properly match unknown config files for Windows
-   [#&#8203;37513](quarkusio/quarkus#37513) - Save pathParamValues encoded and perform decoding when requested
-   [#&#8203;37505](quarkusio/quarkus#37505) - Bump org.jboss.logmanager:log4j2-jboss-logmanager from 1.1.1.Final to 1.1.2.Final
-   [#&#8203;37496](quarkusio/quarkus#37496) - Quarkus 3.6.0 generate wrong jacoco xml
-   [#&#8203;37493](quarkusio/quarkus#37493) - upgrading from quarkus 3.5.3 to 3.6.0  java.lang.IllegalArgumentException: A case block for the string value already exist
-   [#&#8203;37479](quarkusio/quarkus#37479) - Redis Cache ttl default value invalid setting
-   [#&#8203;37357](quarkusio/quarkus#37357) - Runtime OpenAPI filters are not registered for reflection
-   [#&#8203;37298](quarkusio/quarkus#37298) - Bump Keycloak version to 23.0.0
-   [#&#8203;37187](quarkusio/quarkus#37187) - Bump org.apache.commons:commons-compress from 1.24.0 to 1.25.0
-   [#&#8203;37129](quarkusio/quarkus#37129) - Bump org.jetbrains.kotlinx:kotlinx-serialization-json from 1.6.0 to 1.6.1
-   [#&#8203;37128](quarkusio/quarkus#37128) - Bump org.junit:junit-bom from 5.10.0 to 5.10.1
-   [#&#8203;37035](quarkusio/quarkus#37035) - Register methods of RESTeasy reactive parameter containers for reflection
-   [#&#8203;36986](quarkusio/quarkus#36986) - Native not index method with SSE and throw NoSuchMethodException
-   [#&#8203;36813](quarkusio/quarkus#36813) - config-yaml warning - unrecognized configuration file on Windows
-   [#&#8203;36773](quarkusio/quarkus#36773) - "Unrecognized configuration file" when using YAML
-   [#&#8203;35960](quarkusio/quarkus#35960) - PathParam URL encoded in quarkus-resteasy-reactive since quarkus 3.2.x

### [`v3.6.1`](https://github.com/quarkusio/quarkus/releases/tag/3.6.1)

[Compare Source](quarkusio/quarkus@3.6.0...3.6.1)

##### Complete changelog

-   [#&#8203;37486](quarkusio/quarkus#37486) - Revert "Unlist quarkus-resteasy-qute and quarkus-resteasy-reactive-qute"
-   [#&#8203;37478](quarkusio/quarkus#37478) - Qute resteasy change in 3.6.0
-   [#&#8203;37454](quarkusio/quarkus#37454) - Config: detect injected config value mismatch for missing values
-   [#&#8203;37453](quarkusio/quarkus#37453) - Fix Panache bytecode enhancement for `@Embeddable` records
-   [#&#8203;37449](quarkusio/quarkus#37449) - Update Apache Maven to 3.9.6
-   [#&#8203;37447](quarkusio/quarkus#37447) - Add Content-Range header to 206 Partial Content file response
-   [#&#8203;37444](quarkusio/quarkus#37444) - Injecting ConfigProperty of type Optional\<List<String>> not working in the native mode
-   [#&#8203;37436](quarkusio/quarkus#37436) - Respect comma escapes in property value for `@RolesAllowed.`
-   [#&#8203;37428](quarkusio/quarkus#37428) - Fix various minor issues in quarkus update
-   [#&#8203;37426](quarkusio/quarkus#37426) - Fix typo configMapRefKey -> configMapKeyRef
-   [#&#8203;37421](quarkusio/quarkus#37421) - Scheduler: register ApplicationNotRunning as bean even if quartz is used
-   [#&#8203;37417](quarkusio/quarkus#37417) - Build fails when using the Quartz extension and `@Scheduled`(..., skipExecutionIf = Scheduled.ApplicationNotRunning.class)
-   [#&#8203;37415](quarkusio/quarkus#37415) - Make Truffle from GraalVM 23.1 work in all Quarkus modes
-   [#&#8203;37401](quarkusio/quarkus#37401) - Print correct profiles in native image
-   [#&#8203;37400](quarkusio/quarkus#37400) - Improve reliability when downloading builder images from Quay.io
-   [#&#8203;37398](quarkusio/quarkus#37398) - Revert "Build cache - Upload quarkus-ide-launcher-999-SNAPSHOT.jar"
-   [#&#8203;37395](quarkusio/quarkus#37395) - Update Gradle to 8.5
-   [#&#8203;37393](quarkusio/quarkus#37393) - Disable new Http2RSTFloodProtectionConfigTest on Windows
-   [#&#8203;37392](quarkusio/quarkus#37392) - Update gradle to 8.5 and backport if possible to finish Java 21 dependencies
-   [#&#8203;37384](quarkusio/quarkus#37384) - Stop disabling unsafe in netty at native-executable runtime
-   [#&#8203;37382](quarkusio/quarkus#37382) - Update MAX_LTS_SUPPORTED_BY_KOTLIN to 21
-   [#&#8203;37367](quarkusio/quarkus#37367) - Documentation: security auth mechanism guide must also list runtime form auth properties alongside build-time ones
-   [#&#8203;37366](quarkusio/quarkus#37366) - Documentation: Fix OIDC credentials reference to secret key
-   [#&#8203;37364](quarkusio/quarkus#37364) - Improve Docker Desktop detection
-   [#&#8203;37361](quarkusio/quarkus#37361) - Do not fail the request in OidcClient filters if OidcClient is disabled
-   [#&#8203;37360](quarkusio/quarkus#37360) - Disable OidcClientFilter at runtime for simpler application testing
-   [#&#8203;37359](quarkusio/quarkus#37359) - Fix incorrect log dependency
-   [#&#8203;37354](quarkusio/quarkus#37354) - Update Boucycastle to 1.77 and Boucycastle FIPS to 1.0.2.4
-   [#&#8203;37351](quarkusio/quarkus#37351) - Upgrade to Jandex 3.1.6
-   [#&#8203;37350](quarkusio/quarkus#37350) - Unlist quarkus-resteasy-reactive-qute and quarkus-resteasy-qute
-   [#&#8203;37347](quarkusio/quarkus#37347) - Runtime (re)initialize Netty's PlatformDependent classes
-   [#&#8203;37318](quarkusio/quarkus#37318) - Use batch mode for update-version.sh
-   [#&#8203;37317](quarkusio/quarkus#37317) - Avoid asking for GPG passphrase on CI
-   [#&#8203;37314](quarkusio/quarkus#37314) - Fix deprecated dev-v1 url with dev-ui in a few places
-   [#&#8203;37300](quarkusio/quarkus#37300) - Prepare docs/sync-web-site.sh for automated releases
-   [#&#8203;37294](quarkusio/quarkus#37294) - Fix the major version of Java 21
-   [#&#8203;37292](quarkusio/quarkus#37292) - Bump testcontainers to 1.19.3 and use docker-java-bom
-   [#&#8203;37291](quarkusio/quarkus#37291) - Bump org.jetbrains.kotlin:kotlin-gradle-plugin-api from 1.9.20 to 1.9.21 in /devtools/gradle
-   [#&#8203;37280](quarkusio/quarkus#37280) - Bump Microsoft SQL Server JDBC driver to 12.4.2
-   [#&#8203;37279](quarkusio/quarkus#37279) - Bump Microsoft SQL Server JDBC driver to 12.4.2
-   [#&#8203;37271](quarkusio/quarkus#37271) - Docs: add keywords to Vert.x guides
-   [#&#8203;37270](quarkusio/quarkus#37270) - Vert.x: report exception for blocking message consumer methods
-   [#&#8203;37268](quarkusio/quarkus#37268) - Reactive REST Client: check for ClientRequestFilter when skipping `@Provider` auto-discovery
-   [#&#8203;37252](quarkusio/quarkus#37252) - Use the default tenant resolver if the custom one does not resolve a tenant
-   [#&#8203;37251](quarkusio/quarkus#37251) - Add a test showing how OIDC ID token can be propagated
-   [#&#8203;37247](quarkusio/quarkus#37247) - Update kindcontainer to 1.4.4
-   [#&#8203;37244](quarkusio/quarkus#37244) - Always execute a JPA password action
-   [#&#8203;37228](quarkusio/quarkus#37228) - Add classes from additional JPA model build items to pre-generate proxies
-   [#&#8203;37224](quarkusio/quarkus#37224) - Qute: dev mode - debug a problem with no-restart-template
-   [#&#8203;37222](quarkusio/quarkus#37222) - RuntimeException in vertx is silently swallowed for blocking ConsumeEvents
-   [#&#8203;37177](quarkusio/quarkus#37177) - QUARKUS_MROFILE=dev and '-Dquarkus.profile=dev' not working for native image
-   [#&#8203;37108](quarkusio/quarkus#37108) - Warning about build time generated proxy for entity OutboxEvent in Hibernate Search
-   [#&#8203;36892](quarkusio/quarkus#36892) - Update Kotlin to version 1.9.21, Mockito to 5.7.0
-   [#&#8203;36747](quarkusio/quarkus#36747) - NoSuchMethodException when reading `@Embeddable` record
-   [#&#8203;36735](quarkusio/quarkus#36735) - Failure to bump BouncyCastle FIPS version to 1.0.2.4 due to a native build failure
-   [#&#8203;36242](quarkusio/quarkus#36242) - Quarkus cannot load Truffle/polyglot languages with the custom class loader.
-   [#&#8203;17839](quarkusio/quarkus#17839) - Invalid memory configuration for netty maxDirectMemory in native image

</details>

<details>
<summary>quarkusio/quarkus-platform</summary>

### [`v3.6.3`](quarkusio/quarkus-platform@3.6.2...3.6.3)

[Compare Source](quarkusio/quarkus-platform@3.6.2...3.6.3)

### [`v3.6.2`](quarkusio/quarkus-platform@3.6.1...3.6.2)

[Compare Source](quarkusio/quarkus-platform@3.6.1...3.6.2)

### [`v3.6.1`](quarkusio/quarkus-platform@3.6.0...3.6.1)

[Compare Source](quarkusio/quarkus-platform@3.6.0...3.6.1)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever MR is behind base branch, or you tick the rebase/retry checkbox.

👻 **Immortal**: This MR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNC4yNC4wIiwidXBkYXRlZEluVmVyIjoiMzQuMjQuMCJ9-->
holly-cummins pushed a commit to holly-cummins/quarkus that referenced this issue Feb 8, 2024
@geoand
Copy link
Contributor

geoand commented Mar 12, 2024

Not @chumer, but yes AFAIK truffle works in native-image applications.

Coming back to this, how is it expected to work in native image? Is there another mechanism other than the classpath that comes into play?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
kind/bug Something isn't working
Projects
None yet
Development

Successfully merging a pull request may close this issue.

6 participants