Replacing nashorn with GraalVM - jira compatiblity issue

Hi Community,

We have a jira plugin, that was using nashorn but now it’s incompatible with latest jira version.

Here is what we have:

  • We are using jdk8 for our jira plugin on jira server/DC,
  • And, we were using nashorn, but now we have to use graalVM instead. We are trying to migrate Nashorn to Graal ScriptEngine

And here is what we have tried:
Option #1
We have followed this guide:

Just to give you a little context: the code is part of a Jira app. So, this is running on top of the Atlassian Jira. Should this be related to the root cause of the issue I’m sharing below?

Regarding compatibility: this should run on Java 8, 11, 15 and 17.

Code:
Builder jsBuilder = Context.newBuilder(“js”).allowIO(true)
.allowExperimentalOptions(true)
.option(“js.nashorn-compat”, “true”)
.allowHostAccess(HostAccess.ALL)
.option(“js.ecmascript-version”, “2021”);
scriptEngine = GraalJSScriptEngine.create(null, jsBuilder);

When initializing the engine we are getting following exception:

java.lang.IllegalArgumentException: Could not find option with name js.ecmascript-version.
at com.oracle.truffle.polyglot.PolyglotEngineException.illegalArgument(PolyglotEngineException.java:125)
at com.oracle.truffle.polyglot.OptionValuesImpl.failNotFound(OptionValuesImpl.java:274)
at com.oracle.truffle.polyglot.PolyglotEngineImpl.parseOptions(PolyglotEngineImpl.java:738)
at com.oracle.truffle.polyglot.PolyglotEngineImpl.(PolyglotEngineImpl.java:303)
at com.oracle.truffle.polyglot.PolyglotImpl.buildEngine(PolyglotImpl.java:276)
at org.graalvm.polyglot.Engine$Builder.build(Engine.java:620)
at com.oracle.truffle.js.scriptengine.GraalJSEngineFactory.createDefaultEngine(GraalJSEngineFactory.java:122)
at com.oracle.truffle.js.scriptengine.GraalJSEngineFactory.getPolyglotEngine(GraalJSEngineFactory.java:134)
at com.oracle.truffle.js.scriptengine.GraalJSScriptEngine.(GraalJSScriptEngine.java:292)
at com.oracle.truffle.js.scriptengine.GraalJSEngineFactory.getScriptEngine(GraalJSEngineFactory.java:196)
at com.oracle.truffle.js.scriptengine.GraalJSEngineFactory.getScriptEngine(GraalJSEngineFactory.java:58)
at com.xpandit.jiraxporter.commons.document.builder.api.javascript.JavaScriptExecutorService.(JavaScriptExecutorService.java:89)
at com.xpandit.jiraxporter.utils.DocumentBuildLookup.lookup(DocumentBuildLookup.java:342)
at com.xpandit.jiraxporter.component.service.XporterServiceImpl.exportIssue(XporterServiceImpl.java:605)
at com.xpandit.jiraxporter.component.service.XporterServiceImpl.generateBulkExportReport(XporterServiceImpl.java:321)
at com.xpandit.jiraxporter.component.bulkexport.BulkExportProcess.run(BulkExportProcess.java:203)
at java.lang.Thread.run(Thread.java:750)

Dependencies we are using on pom.xml:

org.graalvm.js js-scriptengine 22.0.0.2 org.graalvm.js js 22.0.0.2 org.graalvm.sdk graal-sdk 22.0.0.2 org.graalvm.truffle truffle-api 22.0.0.2

Option #2 (as suggested by you)
Tried with dependency as suggested by atlassian team, here is dependency in pom.xml

org.graalvm.polyglot
polyglot
${graalvm.version}


org.graalvm.polyglot
js
${graalvm.version}
pom

We have got the compilation error. That said, suggested dependency is not working for graal injecting into our Xporter application

We tried in multiple dev machine and running into the same error, here is the error snapshot
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /Users/rui.rodrigues/Downloads/xporter-engine /src/main/java/com/xpandit/jiraxporter/commons/document/builder/api/javascript/JavaScriptExecutorService.java:[14,42] package com.oracle.truffle.js.scriptengine does not exist
[ERROR] /Users/rui.rodrigues/Downloads/xporter-engine /src/main/java/com/xpandit/jiraxporter/commons/document/builder/api/javascript/JavaScriptExecutorService.java:[30,28] cannot access org.graalvm.polyglot.Context
bad class file: /Users/rui.rodrigues/.m2/repository/org/graalvm/polyglot/polyglot/23.1.1/polyglot-23.1.1.jar(org/graalvm/polyglot/Context.class)
class file has wrong version 61.0, should be 52.0
Please remove or make sure it appears in the correct subdirectory of the classpath.
[ERROR] /Users/rui.rodrigues/Downloads/xporter-engine /src/main/java/com/xpandit/jiraxporter/commons/document/builder/api/javascript/JavaScriptExecutorService.java:[12,1] cannot find symbol
symbol: static correctQuotes
location: class
[INFO] 3 errors
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.806 s
[INFO] Finished at: 2023-12-12T17:10:16Z
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project xporter-engine: Compilation failure: Compilation failure:
[ERROR] /Users/rui.rodrigues/Downloads/xporter-engine /src/main/java/com/xpandit/jiraxporter/commons/document/builder/api/javascript/JavaScriptExecutorService.java:[14,42] package com.oracle.truffle.js.scriptengine does not exist
[ERROR] /Users/rui.rodrigues/Downloads/xporter-engine /src/main/java/com/xpandit/jiraxporter/commons/document/builder/api/javascript/JavaScriptExecutorService.java:[30,28] cannot access org.graalvm.polyglot.Context
[ERROR] bad class file: /Users/rui.rodrigues/.m2/repository/org/graalvm/polyglot/polyglot/23.1.1/polyglot-23.1.1.jar(org/graalvm/polyglot/Context.class)
[ERROR] class file has wrong version 61.0, should be 52.0
[ERROR] Please remove or make sure it appears in the correct subdirectory of the classpath.
[ERROR] /Users/rui.rodrigues/Downloads/xporter-engine /src/main/java/com/xpandit/jiraxporter/commons/document/builder/api/javascript/JavaScriptExecutorService.java:[12,1] cannot find symbol
[ERROR] symbol: static correctQuotes
[ERROR] location: class
[ERROR] → [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] MojoFailureException - Apache Maven - Apache Software Foundation
rui.rodrigues@Y4R30XDY6V xporter-engine %

Also, there are 2 different version in repo https://mvnrepository.com/artifact/org.graalvm.polyglot/polyglot, and for both version is giving the build/compiler error.

I appreciate any help/suggestions from you.

Thanks,
Nikhil Diwan

Hey @NikhilDiwan ,

I am also trying to integrate GraalVM into a P2 addon and I basically run into similar difficulties.

Did you figure out how to make GraalVM running inside Jira OSGi container?

Cheers,
Florian

Hi there,

I was able to get graalJS running on a P2 app.

You have to add the following dependencies to your pom.xml:

    <dependency>
      <groupId>org.graalvm.js</groupId>
      <artifactId>js-scriptengine</artifactId>
      <version>22.0.0.2</version>
    </dependency>
    <dependency>
      <groupId>org.graalvm.js</groupId>
      <artifactId>js</artifactId>
      <version>22.0.0.2</version>
    </dependency>

Note: Version 22.0.0.2 runs on Java 8. Newer versions require Java 17 (if I’m not wrong).

To execute JS inside Java, you can use the following example:

Context context = Context.newBuilder("js")
        .allowIO(true)
        .allowHostAccess(HostAccess.ALL).build()) {
      context.eval("js",#####YOUR JS HERE####);

I hope this helps you.

Cheers.

Rui Rodrigues.

2 Likes

Hello @rmrodrigues,
thank you for your answer to this thread. I am wondering how you got it working - I followed you instructions - but maybe you can provide some more details.

This is how I tried it:

export JAVA_HOME=openjdk@17 //I also tried with JAVA11 and JAVA8
atlas-update //SDK is at the latest version: 9.1.1
atlas-create-jira-plugin

[INFO] Parameter: groupId, Value: myGraalPlugin
[INFO] Parameter: artifactId, Value: com.test
[INFO] Parameter: version, Value: 1.0.0-SNAPSHOT
[INFO] Parameter: package, Value: myGraalPlugin
[INFO] Parameter: packageInPathFormat, Value: myGraalPlugin
[INFO] Parameter: refappVersion, Value: 3.3.6
[INFO] Parameter: crowdDataVersion, Value: 6.0.1
[INFO] Parameter: refappDataVersion, Value: 6.4.9
[INFO] Parameter: confluenceVersion, Value: 8.6.1
[INFO] Parameter: artifactId, Value: com.test
[INFO] Parameter: fecruDataVersion, Value: 4.8.15-20240307085927
[INFO] Parameter: package, Value: myGraalPlugin
[INFO] Parameter: version, Value: 1.0.0-SNAPSHOT
[INFO] Parameter: useOsgiJavaConfig, Value: Y
[INFO] Parameter: isAtlassianPlugin, Value: N
[INFO] Parameter: groupId, Value: myGraalPlugin
[INFO] Parameter: bambooDataVersion, Value: 9.2.11
[INFO] Parameter: jiraDataVersion, Value: 9.12.2
[INFO] Parameter: platformVersion, Value: 6.0.42
[INFO] Parameter: fecruVersion, Value: 4.8.15-20240307085927
[INFO] Parameter: bambooVersion, Value: 9.2.11
[INFO] Parameter: crowdVersion, Value: 6.0.1
[INFO] Parameter: confluenceDataVersion, Value: 8.6.1
[INFO] Parameter: bitbucketVersion, Value: 6.7.5
[INFO] Parameter: jiraVersion, Value: 9.12.2
[INFO] Parameter: bitbucketDataVersion, Value: 6.7.5

cd myGraalPlugin
atlas-run

This starts Jira like a charm. Then I am adding the graalvm dependencies as you described it to my pom.xml (no other changes):

        <dependency>
            <groupId>org.graalvm.js</groupId>
            <artifactId>js-scriptengine</artifactId>
            <version>22.0.0.2</version>
        </dependency>
        <dependency>
            <groupId>org.graalvm.js</groupId>
            <artifactId>js</artifactId>
            <version>22.0.0.2</version>
        </dependency>

and I start again (in different JAVA environments):

atlas-mvn clean
atlas-run

this gets me always to the same error:

[INFO] [talledLocalContainer]     ********************************************************************************************************************************************************************************************************
[INFO] [talledLocalContainer]     ___ FAILED PLUGIN REPORT _____________________
[INFO] [talledLocalContainer]     
[INFO] [talledLocalContainer]     2 plugins failed to load during Jira startup.
[INFO] [talledLocalContainer]     
[INFO] [talledLocalContainer]     	'com.test.myGraalPlugin' - 'myGraalPlugin'  failed to load.
[INFO] [talledLocalContainer]     		Cannot start plugin: com.test.myGraalPlugin
[INFO] [talledLocalContainer]     			Unable to resolve com.test.myGraalPlugin [196](R 196.0): missing requirement [com.test.myGraalPlugin [196](R 196.0)] osgi.wiring.package; (osgi.wiring.package=com.sun.management) Unresolved requirements: [[com.test.myGraalPlugin [196](R 196.0)] osgi.wiring.package; (osgi.wiring.package=com.sun.management)]
[INFO] [talledLocalContainer]     
[INFO] [talledLocalContainer]     		It was loaded from /Users/xx/myGraalPlugin/target/jira/home/plugins/installed-plugins/myGraalPlugin-1.0.0-SNAPSHOT.jar
[INFO] [talledLocalContainer]     
[INFO] [talledLocalContainer]     	'com.test.myGraalPlugin-tests' - 'myGraalPlugin'  failed to load.
[INFO] [talledLocalContainer]     		Cannot start plugin: com.test.myGraalPlugin-tests
[INFO] [talledLocalContainer]     			Unable to resolve com.test.myGraalPlugin-tests [197](R 197.0): missing requirement [com.test.myGraalPlugin-tests [197](R 197.0)] osgi.wiring.package; (osgi.wiring.package=com.test.api) [caused by: Unable to resolve com.test.myGraalPlugin [196](R 196.0): missing requirement [com.test.myGraalPlugin [196](R 196.0)] osgi.wiring.package; (osgi.wiring.package=com.sun.management)] Unresolved requirements: [[com.test.myGraalPlugin-tests [197](R 197.0)] osgi.wiring.package; (osgi.wiring.package=com.test.api)]
[INFO] [talledLocalContainer]     
[INFO] [talledLocalContainer]     		It was loaded from /Users/xx/myGraalPlugin/target/jira/home/plugins/installed-plugins/myGraalPlugin-1.0.0-SNAPSHOT-tests.jar
[INFO] [talledLocalContainer]     
[INFO] [talledLocalContainer]     ********************************************************************************************************************************************************************************************************


did you use a different configuration like Jira version etc?
your help is very appreciated!

Cheers,
Florian

Hi florian,
Do you have the following instruction in your jira-maven-plugin configuration?

  <extractDependencies>false</extractDependencies>

Are you compiling the app for Java 8 or 17 or other?

Note: I never tried this using atlas-run. I only tested this with a “normal” Jira instance running, but honestly, I think the issue is unrelated.

Cheers,
Rui Rodrigues.

Hey @rmrodrigues
it looks like graalvm inside an OSGi container is not the typical runtime environment:

I managed it with the latest GraalVM version and JAVA 23 - but it only works with Jira 10.x

Thanks for your support!