java - 如何在 Java 15 及更高版本中使用 Nashorn?

标签 java nashorn java-15

我有一个现有的非模块化 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?

最佳答案

根据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'
不幸的是,Standalone 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

关于java - 如何在 Java 15 及更高版本中使用 Nashorn?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65265629/

相关文章:

java - 加载图像以设置背景时出错

java - Gradle Hibernate 配置需要映射类

java - 如何使用EdDSA/Ed448签名算法重新生成私钥?

java - Android 不抛出 SocketException?

java - 安卓 : how to get the walking distance between two geo coordinates?

java - 如何在不使用 "internal"子包中的类的情况下包装到 Nashorn 中的 NativeArray

java - Nashorn 将 java 对象传递给另一个 java 方法

java - 如何避免 JSObject 实现中的内部 Nashorn 类

java - Java 14或15中的字符串插值

java - Java中密封类和最终类的区别