I am trying to use GraalJS inside of an Adobe Experience Manager instance to render React components server side. I am having issues however when attempting to run code using GraalJS. Whenever I run it I am getting an exception being thrown.
org.graalvm.polyglot.PolyglotException: java.lang.NoClassDefFoundError: Could not initialize class com.oracle.truffle.js.runtime.JSContext
at com.oracle.truffle.js.runtime.JSEngine.createContext(JSEngine.java:72) [xxxxxxxxxxxxx:2.1.0.SNAPSHOT]
at com.oracle.truffle.js.runtime.JSEngine.createJSContext(JSEngine.java:80) [xxxxxxxxxxxxx:2.1.0.SNAPSHOT]
at com.oracle.truffle.js.lang.JavaScriptLanguage.newJSContext(JavaScriptLanguage.java:354) [xxxxxxxxxxxxx:2.1.0.SNAPSHOT]
at com.oracle.truffle.js.lang.JavaScriptLanguage.initLanguageContext(JavaScriptLanguage.java:348) [xxxxxxxxxxxxx:2.1.0.SNAPSHOT]
at com.oracle.truffle.js.lang.JavaScriptLanguage.createContext(JavaScriptLanguage.java:323) [xxxxxxxxxxxxx:2.1.0.SNAPSHOT]
at com.oracle.truffle.js.lang.JavaScriptLanguage.createContext(JavaScriptLanguage.java:113) [xxxxxxxxxxxxx:2.1.0.SNAPSHOT]
at com.oracle.truffle.api.LanguageAccessor$LanguageImpl.createEnvContext(LanguageAccessor.java:283) [xxxxxxxxxxxxx:2.1.0.SNAPSHOT]
at com.oracle.truffle.polyglot.PolyglotLanguageContext.ensureCreated(PolyglotLanguageContext.java:557) [xxxxxxxxxxxxx:2.1.0.SNAPSHOT]
at com.oracle.truffle.polyglot.PolyglotLanguageContext.ensureCreated(PolyglotLanguageContext.java:500) [xxxxxxxxxxxxx:2.1.0.SNAPSHOT]
at com.oracle.truffle.polyglot.PolyglotLanguageContext.ensureInitialized(PolyglotLanguageContext.java:642) [xxxxxxxxxxxxx:2.1.0.SNAPSHOT]
at com.oracle.truffle.polyglot.PolyglotContextImpl.eval(PolyglotContextImpl.java:1216) [xxxxxxxxxxxxx:2.1.0.SNAPSHOT]
at com.oracle.truffle.polyglot.PolyglotContextDispatch.eval(PolyglotContextDispatch.java:62) [xxxxxxxxxxxxx:2.1.0.SNAPSHOT]
at org.graalvm.polyglot.Context.eval(Context.java:379) [xxxxxxxxxxxxx:2.1.0.SNAPSHOT]
This is my code:
try {
Context engine = Context.create("js");
Source source = Source.newBuilder("js", script, "<shell>").buildLiteral();
Value value = engine.eval(source);
if (value != null) {
return value.toString();
}
} catch (Exception e) {
e.printStackTrace();
}
And I'm running my instance with these JVM arguments:
java -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI -XX:+UseJVMCICompiler
--module-path=~/aem/graalvm/graal-sdk-21.3.0.jar:~/aem/graalvm/truffle-api-21.3.0.jar
--upgrade-module-path=~/aem/graalvm/compiler-21.3.0.jar:~/aem/graalvm/compiler-management-21.3.0.jar
-cp ~/aem/graalvm/launcher-common-21.3.0.jar:~/aem/graalvm/js-launcher-21.3.0.jar:~/aem/graalvm/js-21.3.0.jar:~/aem/graalvm/truffle-api-21.3.0.jar:~/aem/graalvm/graal-sdk-21.3.0.jar:~/aem/graalvm/js-scriptengine-21.3.0.jar:~/aem/graalvm/regex-21.3.0.jar:~/aem/graalvm/icu4j-70.1.jar
...
As far as I'm aware all of the required dependencies (including the js library which this class belongs to) are present in my classpath and my project's dependencies. I can run unit tests just fine, I only have this issue when running in an actual AEM instance.
I found out what was wrong, turns out I was missing the icu4j dependency and was not importing it in my bundle's
<Import-Package>
tag.