Search code examples
javajakarta-eewildflyclassnotfoundexceptiongraalvm

Using GraalVM (scripting) within Wildfly/JBoss


I want to use GraalVM (version 22.0.0.2 with Java 17.0.2) to execute JavaScripts within Wildfly (version 26.0).

If I do have the following code:

System.out.println("Polyglot class: "+PolyglotException.class);

then my JSE unit test, started from Eclise, works fine. But if I call the same code within my EAR within Wildfly, I get an

java.lang.ClassNotFoundException: org.graalvm.polyglot.PolyglotException

What's wrong? How can I inform Wildfly that the org.graalvm classes are available?


Solution:

Thanks to ehsavoie for the hint! I already had such an idea but did something wrong when testing.

You do have to do the following:

  1. Put in your file jboss-dependendt-structure.xml something like:

    <jboss-deployment-structure>
        <deployment>
            <dependencies>
                <module name="org.graalvm" export="true"/>
            </dependencies>
        </deployment>
    </jboss-deployment-structure>
    
  2. define a file within `modules/org/graalvm/main/module.xml' with content like:

    <module name="org.graalvm" xmlns="urn:jboss:module:1.6">
        <properties>
            <property name="jboss.api" value="public"/>
        </properties>
        <dependencies>
            <system export="true">
                <paths>
                    <path name="org/graalvm/polyglot"/>
                    <!-- probably more packages will follow, but this is enough for the example -->
                </paths>
            </system>
        </dependencies>
    </module>
    

Sorry if there are any typos in upper examples. I hope, future Wildfly versions will maybe contain such a file automatically. For the moment, I am happy that it's working at all.


Solution

  • You would have to add dependency on the org.graavml.polyglot module in your application or expose it like what is done with the module /sun/scripting/main/