Skip to content

Polyglot application using truffle-enterprise fails due to missing nativebridge artifact in boot. #50251

@tzezula

Description

@tzezula

Describe the bug

Polyglot application using truffle-enterprise fails due to missing org.graalvm.sdk:nativebridge artifact in bootlibraries. The org.graalvm.sdk:nativebridge artifact which is a truffle-enterprise dependency is put into main libraries. The list of polyglot artefacts which are placed into a boot libraries is in quarkus-core.jar's quarkus-extension.properties but it's missing the org.graalvm.sdk:nativebridge.

This causes the following exception in the polyglot application:

java.lang.ClassNotFoundException: org.graalvm.nativebridge.IsolateCreateException
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:580)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:490)
at java.base/java.lang.Class.getDeclaredConstructors0(Native Method)
at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:2985)
at java.base/java.lang.Class.getConstructor0(Class.java:3180)
at java.base/java.lang.Class.getConstructor(Class.java:2199)
at java.base/java.util.ServiceLoader.getConstructor(ServiceLoader.java:623)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1111)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1142)
at java.base/java.util.ServiceLoader$1.hasNext(ServiceLoader.java:1164)
at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1246)
at org.graalvm.polyglot.Engine.loadAndValidateProviders(Engine.java:1824)
at org.graalvm.polyglot.Engine$1.run(Engine.java:1916)
at org.graalvm.polyglot.Engine$1.run(Engine.java:1911)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:74)
at org.graalvm.polyglot.Engine.initEngineImpl(Engine.java:1911)
at org.graalvm.polyglot.Engine$ImplHolder.(Engine.java:179)
at org.graalvm.polyglot.Engine.getImpl(Engine.java:518)

Expected behavior

The org.graalvm.sdk:nativebridge artefact should be in boot libraries because it's a truffle-enterprise dependency.

Actual behavior

Polyglot application throws ClassNotFoundException.

java.lang.ClassNotFoundException: org.graalvm.nativebridge.IsolateCreateException
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:580)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:490)
at java.base/java.lang.Class.getDeclaredConstructors0(Native Method)
at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:2985)
at java.base/java.lang.Class.getConstructor0(Class.java:3180)
at java.base/java.lang.Class.getConstructor(Class.java:2199)
at java.base/java.util.ServiceLoader.getConstructor(ServiceLoader.java:623)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1111)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1142)
at java.base/java.util.ServiceLoader$1.hasNext(ServiceLoader.java:1164)
at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1246)
at org.graalvm.polyglot.Engine.loadAndValidateProviders(Engine.java:1824)
at org.graalvm.polyglot.Engine$1.run(Engine.java:1916)
at org.graalvm.polyglot.Engine$1.run(Engine.java:1911)

How to Reproduce?

Use https://github.com/timfel/graalpy-quarkus-dev.git with the following path.

diff --git a/build.gradle.kts b/build.gradle.kts
index 05d8f32..6239c70 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -25,6 +25,7 @@ dependencies {
     implementation("io.quarkus:quarkus-rest")
     testImplementation("io.quarkus:quarkus-junit5")
     testImplementation("io.rest-assured:rest-assured")
+    implementation("org.graalvm.polyglot:python-isolate-darwin-aarch64:25.0.0")
 }
 
 graalPy {
diff --git a/src/main/java/com/acme/GraalPyContextProvider.java b/src/main/java/com/acme/GraalPyContextProvider.java
index 39b41f3..b9c5dae 100644
--- a/src/main/java/com/acme/GraalPyContextProvider.java
+++ b/src/main/java/com/acme/GraalPyContextProvider.java
@@ -33,6 +33,8 @@ public class GraalPyContextProvider {
             GraalPyResources.extractVirtualFileSystemResources(vfs, tmpdir);
             return GraalPyResources.contextBuilder(tmpdir)
                     .allowNativeAccess(false)
+                    .option("engine.SpawnIsolate", "python")
+                    .option("engine.IsolateMode", "external")
                     .build();
         } catch (Exception ex) {
             throw new RuntimeException("Could not initialize Python context", ex);

Output of uname -a or ver

No response

Output of java -version

No response

Quarkus version or git rev

No response

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

No response

Additional information

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    kind/bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions