Java 8中用Nashorn执行JS文件遇import/require报错求助
解决方案
核心问题
Nashorn 并非 Node.js 运行环境,原生不支持 Node 的 require 语法,对 ES6 模块 import 的支持也仅局限于自身的模块系统,无法直接加载 npm 安装的第三方包。以下是三种可行的解决思路:
方法1:将依赖打包为独立JS文件(推荐)
用 Browserify 或 Webpack 把 @adeunis/codecs 及其依赖打包成一个无需外部依赖的单文件,直接在 Nashorn 中运行:
- 全局安装 Browserify:
npm install -g browserify - 创建一个入口文件
bundle-entry.js,把库挂载到全局对象:const codec = require('@adeunis/codecs'); // 挂载到全局,方便Nashorn调用 global.codec = codec; - 执行打包命令,生成独立文件:
browserify bundle-entry.js -o bundled-codec.js - 将
bundled-codec.js放到 Java 项目的资源目录,然后在 Java 中加载执行:import javax.script.*; import java.io.*; public class CodecDecoder { public static void main(String[] args) throws Exception { ScriptEngineManager manager = new ScriptEngineManager(); NashornScriptEngine engine = (NashornScriptEngine) manager.getEngineByName("nashorn"); // 启用ES6支持 engine.eval("--language=es6"); // 加载打包后的JS文件 InputStream jsStream = CodecDecoder.class.getResourceAsStream("/bundled-codec.js"); engine.eval(new InputStreamReader(jsStream)); // 调用解码方法 String encodedStr = "待解码的字符串"; String jsonResult = (String) engine.eval("JSON.stringify(codec.decode('" + encodedStr + "'))"); System.out.println(jsonResult); } }
方法2:为Nashorn添加CommonJS模块支持
借助 nashorn-commonjs 库模拟 Node 的 require 功能:
- 在项目中添加
nashorn-commonjs依赖(可通过 Maven/Gradle 引入) - 在 Java 代码中先初始化模块加载器,再加载你的 JS 文件:
你的 JS 文件可以保留import javax.script.*; import io.github.nashorn.commonsjs.module.ModuleLoader; public class CodecDecoder { public static void main(String[] args) throws Exception { ScriptEngineManager manager = new ScriptEngineManager(); NashornScriptEngine engine = (NashornScriptEngine) manager.getEngineByName("nashorn"); engine.eval("--language=es6"); // 初始化CommonJS模块加载器,指定npm依赖的目录 ModuleLoader loader = new ModuleLoader(engine, new File("./node_modules")); loader.install(); // 加载你的JS文件(此时可以用require) InputStream jsStream = CodecDecoder.class.getResourceAsStream("/your-script.js"); engine.eval(new InputStreamReader(jsStream)); } }const codec = require('@adeunis/codecs')语法。
方法3:直接嵌入库源码
如果 @adeunis/codecs 是纯 JS 库且依赖少,可直接将其源码复制到你的 JS 文件中,省去模块加载步骤:
- 找到
node_modules/@adeunis/codecs目录下的核心源码文件(通常是index.js或dist下的文件) - 将源码内容复制到你的 JS 文件顶部,然后直接调用解码方法,无需
require或import
内容的提问来源于stack exchange,提问作者edoreld
相关产品推荐
相关产品推荐

