You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 8中用Nashorn执行JS文件遇import/require报错求助

解决方案

核心问题

Nashorn 并非 Node.js 运行环境,原生不支持 Node 的 require 语法,对 ES6 模块 import 的支持也仅局限于自身的模块系统,无法直接加载 npm 安装的第三方包。以下是三种可行的解决思路:


方法1:将依赖打包为独立JS文件(推荐)

用 Browserify 或 Webpack 把 @adeunis/codecs 及其依赖打包成一个无需外部依赖的单文件,直接在 Nashorn 中运行:

  1. 全局安装 Browserify:
    npm install -g browserify
    
  2. 创建一个入口文件 bundle-entry.js,把库挂载到全局对象:
    const codec = require('@adeunis/codecs');
    // 挂载到全局,方便Nashorn调用
    global.codec = codec;
    
  3. 执行打包命令,生成独立文件:
    browserify bundle-entry.js -o bundled-codec.js
    
  4. 将 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 功能:

  1. 在项目中添加 nashorn-commonjs 依赖(可通过 Maven/Gradle 引入)
  2. 在 Java 代码中先初始化模块加载器,再加载你的 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));
        }
    }
    
    你的 JS 文件可以保留 const codec = require('@adeunis/codecs') 语法。

方法3:直接嵌入库源码

如果 @adeunis/codecs 是纯 JS 库且依赖少,可直接将其源码复制到你的 JS 文件中,省去模块加载步骤:

  1. 找到 node_modules/@adeunis/codecs 目录下的核心源码文件(通常是 index.js 或 dist 下的文件)
  2. 将源码内容复制到你的 JS 文件顶部,然后直接调用解码方法,无需 require 或 import

内容的提问来源于stack exchange,提问作者edoreld

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 17:10:17