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