使用 require.js 和 Java/Rhino 解析模块

2023-11-24

我试图让 require.js 使用 Java 6 和 Rhino 在服务器端加载模块。

我能够很好地加载 require.js 本身。犀牛可以看到require()功能。我可以看出,因为 Rhino 抱怨当我更改时它找不到该功能require()到其他类似的东西requireffdkj().

但是当我尝试要求一个简单的 JS 时,比如hello.js

var hello = 'hello';

使用以下任一方法:

require('hello');
require('./hello');

它不起作用。我明白了

Caused by: javax.script.ScriptException: sun.org.mozilla.javascript.internal.JavaScriptException: [object Error] (<Unknown source>#31) in <Unknown source> at line number 31
    at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:153)
    at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:167)
    at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:247)

我有我的hello.js位于 Java 类路径的顶部。那就是我有的地方require.js以及。我尝试移动hello.js我认为它可能会去的任何地方,包括我的硬盘驱动器的根目录、我的用户目录的根目录、我运行 Java 应用程序的目录等。什么都不起作用。

我查看了 CommonJS 规范(http://wiki.commonjs.org/wiki/Modules/1.0)并且它说顶级ID(例如hello)从“概念模块名称空间根”解析,而相对ID(如./hello)针对调用模块进行解析。我不确定这些基线在哪里,我怀疑这就是问题所在。

有什么建议么?我什至可以使用 Rhino 中的 require.js 吗?

EDIT:认为我需要按照下面评论中 Pointy 的建议设置环境,我尝试评估r.js以及。 (我尝试评估后评估require.js,然后再之前require.js.)在任何一种情况下我都会收到错误:

Caused by: javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "arguments" is not defined. (<Unknown source>#19) in <Unknown source> at line number 19
    at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:153)
    at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:167)
    at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:247)

“arguments”似乎是一个变量r.js。我认为这是用于命令行参数,所以我不认为r.js是我想做的事情的正确道路。但不确定。


require.js 与 rhino 配合良好。最近,我在一个项目中使用了它。

  1. 你必须确保使用r.js(不是 require.js),针对 rhino 的 require.js 的修改版本。
  2. 你必须延长ScritableObject要实现的类load and print功能。你打电话时require(["a"]),该类中的load函数将被调用,您可以调整该函数以从任何位置加载js文件。在下面的示例中,我加载自classpath.
  3. 您必须定义属性arguments在共享范围中,如下面的示例代码所示
  4. 或者,您可以使用配置子路径require.config,指定js文件所在classpath内的子目录。

Js运行时支持

public class JsRuntimeSupport extends ScriptableObject {

    private static final long serialVersionUID = 1L;
    private static Logger logger = Logger.getLogger(JsRuntimeSupport.class);
    private static final boolean silent = false;

    @Override
    public String getClassName() {
        return "test";
    }

    public static void print(Context cx, Scriptable thisObj, Object[] args,
            Function funObj) {
      if (silent)
        return;
        for (int i = 0; i < args.length; i++)
          logger.info(Context.toString(args[i]));
    }

    public static void load(Context cx, Scriptable thisObj, Object[] args,
            Function funObj) throws FileNotFoundException, IOException {
        JsRuntimeSupport shell = (JsRuntimeSupport) getTopLevelScope(thisObj);
        for (int i = 0; i < args.length; i++) {
            logger.info("Loading file " + Context.toString(args[i]));
            shell.processSource(cx, Context.toString(args[i]));
        }
    }

    private void processSource(Context cx, String filename)
            throws FileNotFoundException, IOException {
        cx.evaluateReader(this, new InputStreamReader(getInputStream(filename)), filename, 1, null);
    }

    private InputStream getInputStream(String file) throws IOException {
        return new ClassPathResource(file).getInputStream();
    }
}

示例代码

public class RJsDemo {

    @Test
    public void simpleRhinoTest() throws FileNotFoundException, IOException {
    Context cx = Context.enter();

    final JsRuntimeSupport browserSupport = new JsRuntimeSupport();

    final ScriptableObject sharedScope = cx.initStandardObjects(browserSupport, true);

    String[] names = { "print", "load" };
    sharedScope.defineFunctionProperties(names, sharedScope.getClass(), ScriptableObject.DONTENUM);

    Scriptable argsObj = cx.newArray(sharedScope, new Object[] {});
    sharedScope.defineProperty("arguments", argsObj, ScriptableObject.DONTENUM);

    cx.evaluateReader(sharedScope, new FileReader("./r.js"), "require", 1, null);
    cx.evaluateReader(sharedScope, new FileReader("./loader.js"), "loader", 1, null);

    Context.exit();

  }

}

加载器.js

require.config({
    baseUrl: "js/app"
});

require (["a", "b"], function(a,  b) {
    print('modules loaded');
});

js/app目录应该位于您的类路径中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 require.js 和 Java/Rhino 解析模块 的相关文章

随机推荐

  • 如何在 MATLAB 中删除元胞数组内的零项?

    我在 MATLAB 中有一个元胞数组 可以说cell arr它有零条目和非零单元格条目 例如 cell arr 0 0 0 0 0 1x3 cell 1x3 cell 1x3 cell 1x3 cell 有人可以告诉我如何从cell arr
  • 从 Facebook 获取长期访问令牌

    据我了解 最近Facebook决定删除offline access权限 并引入了一种称为长期访问令牌的概念 该令牌的最长有效期为 60 天 有谁知道如何使用 Facebook JavaScript SDK 获取此访问令牌 有一种方法可以将其
  • VariableDoesNotExist:在 u'None' 中查找键 [val2] 失败

    我正在得到一个VariableDoesNotExist以下代码片段出现错误时obj1 page is None obj1 val1 default obj1 page val2 通常 Django 模板不关心属性访问None values
  • 父 DIV 中的圆角不影响子 DIV

    所以 我正在尝试在 CSS3 中使用圆角 不在 IE 中 不关心它是否在那里工作 并且我有一个 DIV 我的所有内容都在其中看起来非常漂亮 我遇到的问题是 有些子 DIV 没有被父级的圆角 掩盖 我不是在寻找孩子继承圆角 我只想让父级内部的
  • 检索 iOS 中按上次播放时间排序的歌曲列表

    我需要获得一份清单N按顺序最近从 iOS 设备播放的歌曲 目前我能想象的唯一方法就是将所有歌曲都通过一个MPMediaQuery并手动对它们进行排序lastPlayedDate 这是一项可能昂贵的操作 我想知道是否有更好的方法 编辑 经过一
  • 如何将枚举数组序列化为 Json 字符串数组? [复制]

    这个问题在这里已经有答案了 根据迭戈在这个问题中得票最高的答案下未答复的评论 枚举的 JSON 序列化为字符串 所以对于一个枚举 public enum ContactType Phone 0 Email 1 Mobile 2 例如 一个属
  • gnuplot:应用数据文件中的颜色名称

    如何从数据文件中获取颜色名称 我没想到这会如此困难 但显然确实如此 为什么版本 1 和版本 2 给出错误的颜色 有没有像版本 3 那样不使用数组的更简单的方法来获得正确的颜色 和 lc var仅适用于索引值 不适用于颜色名称 colorna
  • 下载大尺寸json时如何解决Uncaught RangeError

    我正在尝试下载大型 json 数据 但这导致Uncaught RangeError Invalid string length 请帮忙解决这个问题 提前致谢 这是 Jsfiddle http jsfiddle net sLq3F 456 您
  • 在 Weblogic 12.1.3 上找不到文件 Metro-default.xml

    我们当前在 WebLogic 12 1 2 上运行 在这个环境中我们的应用程序运行良好 我们现在想要的是将我们的应用程序与 WebLogic 12 1 3 环境进行认证 但我们所使用的 Web 服务面临着一个问题 在新版本中 服务器抛出异常
  • 使用给定的概率密度函数生成随机数

    我想指定概率密度函数的分布 然后在 Python 中从该分布中选取 N 个随机数 我该如何去做呢 一般来说 您需要逆累积概率密度函数 一旦你有了这个 那么沿着分布生成随机数就很简单了 import random def sample n r
  • “inline-style”-内容安全策略和 Javascript 错误

    我在 Apache2 配置中使用以下命令在服务器上打开了内容安全策略 Header set Content Security Policy Report Only default src self 我将其设置为 Report Only仅报告
  • 错误,无法设置范围类的 FormulaArray 属性

    我创建了以下公式 IFNA LOOKUP 10 99 MID O2 MIN IF ISNUMBER MID O2 ROW 1 25 1 0 ISNUMBER MID O2 ROW 2 26 1 ROW 2 26 ROW 1 25 SUMPR
  • 如何作为脉冲应用程序在表格之间复制单元格

    我需要复制单元格2 个表视图之间 我有一个或多或少可行的解决方案 然而 这并不顺利 我很想做类似的事情脉冲应用程序重新排序 Feed 选项 脉冲工作方式的特殊之处在于 重新排序动画与正常的单元格重新排序相同 但单元格仍然可以在表之间移动 这
  • 如何模拟 httpcontext 使其在单元测试中不为 null?

    我正在编写一个单元测试 控制器方法抛出异常 因为 HttpContext ControllerContext 为 null 我不需要断言 HttpContext 中的任何内容 只需要它不为 NULL 即可 我做了研究 我相信最小起订量就是答
  • 如何在 Rails 测试中将 autotest 和 spork 结合起来?

    自动测试通过仅运行更改的测试来提高测试运行的速度 但我想通过使用 spork 预加载 Rails 环境来进一步推动它 这样我就能获得更快的反馈 这可能吗 自动测试 https github com grosser autotest Spor
  • D3圆弧渐变[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我正在尝试使用 d3 创建一个计时器 它的梯度会在 0 到 100 之间变化 例如 深橙色为 0 浅橙色为 100 我可以在深橙色和浅橙色之间进行弧线过渡 但在找到任何允许我对弧线应
  • 如何在MonoDevelop中进入框架源代码

    在 MonoDevelop 中调试项目时 如何进入 Mono Framework 源代码 我正在运行 openSUSE 11 3 中的普通 MonoDevelop 这是一篇旧帖子 但我今天偶然发现它寻找答案 所以希望它对其他人有帮助 除非您
  • 为什么 ***NO_CI*** 仍然导致持续集成构建?

    我最近发现了 TFS 的 隐藏功能 如果您的评论包含以下内容 它允许您阻止 CI 构建启动 NO CI 我在家里运行了 TFS 这个小技巧很有用 在工作中 我们还使用 TFS 2010 我发现这仍然不能阻止 CI 构建在我们的设置中启动 我
  • angularJS 发送 OPTIONS 而不是 POST

    我被困在这两天我找不到解决方案 当我执行 AngularJS POST 时 它会在标头中发送选项并从 API 返回错误 代码看起来没什么特别的 http defaults headers post Content Type applicat
  • 使用 require.js 和 Java/Rhino 解析模块

    我试图让 require js 使用 Java 6 和 Rhino 在服务器端加载模块 我能够很好地加载 require js 本身 犀牛可以看到require 功能 我可以看出 因为 Rhino 抱怨当我更改时它找不到该功能require