我被一个涉及GraalJS的问题困住了。我正在尝试使用它作为我的JavaScript后端。当我从IntelliJ运行时,它运行得完美无缺,但一旦导出可运行的.jar,它就停止工作。我已经调试这个问题几天了,下面是我的发现。
应该提到的是,我是通过使用名为libGdx :dist的libGdx附带的gradle命令来生成可运行的dist的。
首先,这些是我使用的依赖项。
// GraalVM
compile group: 'org.graalvm.js', name: 'js', version: '20.2.0'
compile group: 'org.graalvm.js', name: 'js-scriptengine', version: '20.2.0'
compile group: 'org.graalvm.sdk', name: 'graal-sdk', version: '20.2.0'
compile group: 'org.graalvm.truffle', name: 'truffle-api', version: '20.2.0'
implementation 'com.ibm.icu:icu4j:51.1'我就是这样构建我的ScriptEngine的
private fun getGraalEngine() = GraalJSScriptEngine.create(
Engine.newBuilder()
.allowExperimentalOptions(false)
.useSystemProperties(false)
.build(),
Context.newBuilder("js")
.allowHostAccess(HostAccess.ALL)
.allowHostClassLookup { true }
.allowAllAccess(true))现在,当我从.jar运行程序时,我得到了以下异常:
java.lang.IllegalArgumentException: Could not find option with name js.script-engine-global-scope-import.
at com.oracle.truffle.polyglot.PolyglotEngineException.illegalArgument(PolyglotEngineException.java:128)
at com.oracle.truffle.polyglot.OptionValuesImpl.failNotFound(OptionValuesImpl.java:283)
at com.oracle.truffle.polyglot.PolyglotContextConfig.findLanguageForOption(PolyglotContextConfig.java:239)
at com.oracle.truffle.polyglot.PolyglotContextConfig.<init>(PolyglotContextConfig.java:129)
at com.oracle.truffle.polyglot.PolyglotEngineImpl.createContext(PolyglotEngineImpl.java:1434)
at org.graalvm.polyglot.Context$Builder.build(Context.java:1598)经过一些调试后,我得出这样的结论:当PolyglotContextConfig试图为optionName js找到一个PolyglotLanguage时,就会发生这种情况。这就是IntelliJ和运行的.jar之间的区别。IntelliJ包含对JavaScript PolyglotLanguage的支持,而.jar没有。这是我发现的
通过查看Engine -> impl -> idToLanguage (我通过反射访问了这些包私有字段),我得到了以下结果
Intellij:
id to lang: {regex=PolyglotLanguage [id=regex, name=REGEX, host=false], js=PolyglotLanguage [id=js, name=JavaScript, host=false]}可运行的.jar:
id to lang: {regex=PolyglotLanguage [id=regex, name=REGEX, host=false]}原来对JavaScript的支持.想念吗?正因为如此,当PolyglotContextConfig.findLanguageForOption()试图将js optionName与JavaScript PolyglotLanguage匹配时,就会出现异常。
我不知道该怎么做或者为什么会发生这种事。也许是关于类加载器的东西?无论哪种方式,任何帮助都将不胜感激。
发布于 2021-10-12 14:53:16
以下链接回答了我的问题:https://github.com/oracle/graaljs/issues/125
结果表明,在.jar打包过程中,REGEX和Javascript的PolyglotLanguage条目以某种方式被覆盖。这意味着您必须在.jar中META-INF/truffle/language创建一个文件,并添加答案中的内容。注意,对我来说,github链接中的内容不太管用。我需要把它们换成
#https://github.com/graalvm/graaljs/issues/125
language2.characterMimeType.0=application/javascript
language2.characterMimeType.1=application/javascript+module
language2.characterMimeType.2=text/javascript
language2.className=com.oracle.truffle.js.lang.JavaScriptLanguage
language2.defaultMimeType=application/javascript
language2.dependentLanguage.0=regex
language2.fileTypeDetector0=com.oracle.truffle.js.lang.JSFileTypeDetector
language2.id=js
language2.implementationName=GraalVM JavaScript
language2.interactive=true
language2.internal=false
language2.name=JavaScript
language2.version=inherithttps://stackoverflow.com/questions/69540452
复制相似问题