19

我有一个现有的非模块化 Spring Boot 应用程序并使用 Nashorn。该应用程序在 Java 14 上运行良好。

添加可用于 Java 15 的新 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?

4

3 回答 3

16

根据JEP 372,Nashorn 已从 JDK 15 中删除,但您可以从https://search.maven.org/artifact/org.openjdk.nashorn/nashorn-core/15.0/jar获取最新的 nashorn

对于 Maven,将以下依赖项包含到您的pom.xml

<dependency>
  <groupId>org.openjdk.nashorn</groupId>
  <artifactId>nashorn-core</artifactId>
  <version>15.0</version>
</dependency>

对于 Gradle,将以下依赖项包含到您的build.gradle

implementation 'org.openjdk.nashorn:nashorn-core:15.0'

不幸的是,独立 Nashorn只能用作 JPMS 模块。因此,您可能需要遵循https://stackoverflow.com/a/46289257中所述的解决方案,以使其与非模块化应用程序一起使用。

从给定的类中xxxxx.yyyy.service.JavaScriptServiceImpl并根据@JornVernee 和@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
于 2020-12-12T14:22:32.370 回答
16

I just released Nashorn 15.1 which makes it possible for Nashorn to function when loaded through classpath instead of through modulepath. I tested it with a small Spring Boot application of my own, and it works.

于 2020-12-23T16:34:59.760 回答
15
于 2020-12-13T16:50:44.293 回答