jrunscript 因依赖的 nashorn 引擎在 jdk 11 被弃用、jdk 15 彻底移除而无人使用,仅限 jdk 8–11 且不支持 es6+、性能差、无调试;替代方案包括 graalvm context api、node.js 外调或 java 原生方法。

为什么 jrunscript 现在基本没人用了
因为从 JDK 15 开始,jrunscript 就被彻底移除了。它依赖的 Nashorn 引擎早在 JDK 11 就被标记为 @Deprecated,JDK 14 正式废弃,JDK 15 直接删掉——不是“不推荐”,是“没这个命令了”。如果你在新项目里还想着用 jrunscript 跑 JS,第一步就得先确认 JDK 版本:java -version 输出是 11 或更低才可能有;14+ 肯定报 command not found。
常见错误现象:jrunscript: command not found(Linux/macOS)或 'jrunscript' is not recognized(Windows),不是环境变量没配好,是它真没了。
- 使用场景极窄:仅限 JDK 8–11 的运维脚本、临时调试、教学演示
- 不支持 ES6+ 语法(比如
const、箭头函数、Promise),连let都会报错 - 性能差,启动慢,无调试支持,也没办法加载外部 npm 包
jrunscript 在 JDK 8–11 中怎么跑最稳
它本质是个轻量级 REPL,不是 Node.js 替代品。想让它少出错,得盯住三个点:引擎选择、脚本路径、字符编码。
- 默认用 Nashorn,但可显式指定:
jrunscript -engine nashorn hello.js;如果装了 GraalVM,还能切到-engine graal.js(需额外配置) - 脚本路径别用中文或空格,
jrunscript -f ./test script.js会失败——空格会被当参数分隔,必须写成jrunscript -f "./test script.js" - Windows 上默认 GBK 编码,JS 文件若存为 UTF-8 无 BOM,中文字符串会乱码;加
-encoding UTF-8参数才能读对 - 交互模式下输入 JS 代码,回车即执行,但
function声明后必须空一行再调用,否则解析失败
替代方案选哪个?看你要啥
真要从 Java 进程里跑 JS,别硬扛 jrunscript,直接换现代方案。
Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统
立即学习“Java免费学习笔记(深入)”;
- 需要嵌入 JS 到 Java 应用?用 GraalVM 的
ContextAPI:Context.create("js"),支持 ES2022、多线程、与 Java 对象互操作 - 只是想执行一段 JS 做数据转换?用
node外部调用更可靠:Runtime.getRuntime().exec("node script.js"),前提是服务器装了 Node - 纯本地快速验证?VS Code 装 JavaScript (ES6) 插件 + Code Runner,比开 JDK 环境快得多
注意:ScriptEngineManager + getEngineByName("nashorn") 在 JDK 15+ 同样失效,不是类找不到,是整个 jdk.scripting.nashorn 模块被删了。
遗留系统里遇到 jrunscript 报错,先查什么
老项目升级 JDK 后崩在 jrunscript 调用上,别急着重写,先定位是不是“表面问题”。
- 检查是否误用了
-l(list engines)参数:JDK 11 下输出nashorn,JDK 12+ 直接报No ScriptEngineManager providers found - 脚本里用了
Java.type?这是 Nashorn 特有语法,Graal.js 里得改用Java.type("java.util.ArrayList")→Java.type("java.util.ArrayList")(看起来一样,但底层机制不同,部分泛型写法会挂) - 错误信息含
javax.script.ScriptException: TypeError?大概率是 JS 语法超出了 Nashorn 能力(如解构赋值),不是 Java 层的问题
最常被忽略的一点:有些构建脚本把 jrunscript 当作“跨平台 shell 替代品”来用,比如生成时间戳或拼接字符串——这种完全可以用 Java 的 String.format 或 Instant.now() 一行解决,没必要绑死 JS 引擎。









