如何在Java15及更高版本中使用nashorn?

vhmi4jdf  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(866)

我有一个现有的spring引导应用程序,它是非模块化的,并且使用nashorn。该应用程序在Java14上运行良好。
添加Java15可用的新nashorn的maven坐标后,应用程序在启动脚本引擎时失败。

public static void main(String[] args) throws ScriptException {
    ScriptEngineManager factory = new ScriptEngineManager();
    ScriptEngine engine = factory.getEngineByName("nashorn"); 
    engine.eval("print('Hello, World!');");
}

错误消息:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "javax.script.ScriptEngine.eval(String)" because "engine" is null
    at xxxxx.yyyy.service.JavaScriptServiceImpl.main(JavaScriptServiceImpl.java:52)

是否需要将整个项目模块化以使用nashorn?

mwngjboj

mwngjboj1#

我刚刚发布了nashorn 15.1,它使得nashorn在通过类路径而不是模块路径加载时能够正常工作。我用我自己的一个小spring boot应用程序测试了它,它可以工作。

r9f1avp5

r9f1avp52#

这里是纳肖恩维修人员。
springboot没有将nashorn作为jpms模块加载,这确实是一个问题。nashorn将自己导出为脚本引擎,由 javax.script.ScriptEngineManager 通过其 module-info.java . 它不使用旧的、非模块化的导出机制,即通过相关的 META-INF/services/… 在jar文件中输入。这意味着如果jar没有作为jpms模块加载,脚本引擎管理器将不会发现它(注:即使它有多余的 META-INF/services 输入时,它不会有帮助,因为nashorn依赖于作为模块加载;作为过去随jdk提供的代码,它从Java9开始就是一个模块……现在要撤销它有些困难。)
我创建了一个小的测试应用程序来证实这一点。我想找些在 Boot 上工作的人帮我弄清真相。boot创建一个fat jar文件并将其所有依赖项打包到该文件中,然后管理它们的加载,这一点很复杂,因此启动时您不能“仅仅”修改modulepath。
希望有一种方法可以告诉boot将依赖项作为模块加载;到目前为止,我通过google找到它的尝试还没有取得成果。

lsmd5eda

lsmd5eda3#

根据jep372,nashorn已经从jdk15中删除,但是你可以从jdk15中获得最新的nashornhttps://search.maven.org/artifact/org.openjdk.nashorn/nashorn-core/15.0/jar
对于maven,在您的 pom.xml ```

org.openjdk.nashorn
nashorn-core
15.0

对于gradle,请将下面的依赖性包含到您的 `build.gradle` ```
implementation 'org.openjdk.nashorn:nashorn-core:15.0'

不幸的是,独立的nashorn只能作为jpms模块使用。所以你可能需要遵循https://stackoverflow.com/a/46289257 使其与非模块化应用程序一起工作。
从给定的类 xx.yyyy.service.JavaScriptServiceImpl 根据@jornverne和@attilaszegedi的反馈,命令行应该是

jdk-15.0.1/bin/java -classpath /home/nashorn-helloworld/target/classes --module-path /home/org/openjdk/nashorn/nashorn-core/15.0:/home/org/ow2/asm/asm/7.3.1:/home/org/ow2/asm/asm-analysis/7.3.1:/home/org/ow2/asm/asm-commons/7.3.1:/home/org/ow2/asm/asm-tree/7.3.1/home/org/ow2/asm/asm-util/7.3.1 --add-modules org.openjdk.nashorn xxxxx.yyyy.service.JavaScriptServiceImpl

相关问题