Java 7 + Rhino 1.7R3 支持 CommonJS 模块吗?

2023-11-21

我需要帮助让 CommonJS 在 Java 7 和 Rhino 1.7R3 上运行。

Rhino 1.7R3 支持 CommonJS 模块:

  • https://developer.mozilla.org/En/New_in_Rhino_1.7R3

Java 7 与 Rhino 1.7R3 捆绑在一起。不幸的是,Java 7的Rhino是一个修改版本,它不包括org.mozilla.javascript.commonjs包裹:

  • http://jdk7.java.net/rhino/README.TXT

我想通过以下方式使用 Rhino 1.7R3 对 CommonJS 的支持javax.script接口如下:

ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
engine.put("markdown", markdown);
engine.eval("var html = require('./Markdown.Sanitizer').getSanitizingConverter().makeHtml(markdown);");
return (String) engine.get("html");

(我通过验证ScriptEngineManager我确实使用的是 Rhino 1.7R3 引擎。)我想也许我可以将以下依赖项添加到类路径中

<dependency>
    <groupId>org.mozilla</groupId>
    <artifactId>rhino</artifactId>
    <version>1.7R3</version>
</dependency>

和 CommonJS——具体来说,require()——要开始工作了。但事实并非如此。当我尝试使用时require() I get

Caused by: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "require" is not defined. (<Unknown source>#2)
    at sun.org.mozilla.javascript.internal.ScriptRuntime.constructError(ScriptRuntime.java:3773)
    at sun.org.mozilla.javascript.internal.ScriptRuntime.constructError(ScriptRuntime.java:3751)
    at sun.org.mozilla.javascript.internal.ScriptRuntime.notFoundError(ScriptRuntime.java:3836)

如何让 Java 7 与完整版本的 Rhino 1.7R3 配合使用,以便获得 CommonJS 支持?

EDIT:我发现以下问题涉及完全相同的主题:

健全性检查:Rhino 没有 require 函数,对吧?

受访者建议也许可以用 CommonJS Rhino 1.7R3 替换有限的 Rhino 1.7R3,但没有说明如何做到这一点。这就是我在这里要问的。


Edit:看来你根本不需要使用 JVM 引导类加载器。 Sun已将默认的Rhino实现类放入

sun.org.mozilla.javascript.*

包裹。但是你加载的Rhino实现会占用

org.mozilla.javascript.*

因此它们不应该发生碰撞。然而如果出了问题您可以在引导类加载器的帮助下覆盖 JDK 中的类。您有两个选择:

基本上,您需要覆盖类路径,以便您的 Rhino 类优先而不是内置类。

  1. 只需将 rhino-1.7R3.jar 放入您的 JRE 路径\lib\ext 即可。这样,Rhino jar 将被添加到 Java Bootsrap 类加载器中,并在内置 JavaScript jar 之前加载。
  2. 或者,如果您无权访问 ../lib/ext,您可以使用命令行选项:

    -Xbootclasspath/a:path/to/rhino-1.7R3.jar
    

犀牛本身does not实现 Java 脚本 API。为了将Rhino集成到JDK中,Sun实现了自己的ScriptEngine and ScriptEngineFactory。因此,如果您加载自己的rhino-1.7R3.jar如果您使用以下命令加载脚本,您将无法使用 Common JS

ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");

相反,你有两个选择。

  1. 实施你自己的 ScriptEngine, ScriptEngineFactory以及 Rhino API 之上的其他相关类。怎么看甲骨文做到了。但请注意,JDK 源代码遵循 GPL 2 许可证,因此您应该发布适用于 Rhino 的自定义脚本引擎包装器,或者仅使用这些类作为参考,而不复制代码。

  2. 直接使用Rhino API. 我强烈推荐这种方法。 Mozilla 网站上有文档和示例但基本的API比较简单:

    // Execution environment for Rhino
    // there should be only one context in a giver thread
    Context cx = Context.enter();
    // Object.prototype, Function prototype, etc.
    Scriptable scope = cx.initStandardObjects();
    
    // Execute script from a given java.io.Reader
    Object result = cx.evaluateReader(scope, reader, 0, null);
    // If returning result isn't sufficient for your needs
    // you can do something like this:
    Object someVar = scope.get("someVar");
    
    // Don't forget to close the context when you're done
    Context.exit();
    

或者,我可以给你一些纯 JS 的解决方案。

  1. 看一眼浏览器化。它是一个 JavaScript 预处理器,它将把您的源代码合并到一个包中。
  2. 重写您的模块,以便它们使用AMD or UMD然后将它们与r.js 工具.

这两个选项都需要您在构建过程中添加 js 预处理步骤,并且可能会使调试代码变得有点困难。

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

Java 7 + Rhino 1.7R3 支持 CommonJS 模块吗? 的相关文章

  • angularjs:如何向资源对象添加缓存?

    在 http 中添加缓存非常简单 通过传递cache true http docs angularjs org api ng http https docs angularjs org api ng service 24http有缓存选项
  • chrome 调试器承诺在暂停时不会解析?

    也许我没有正确调试承诺 但基本上 如果您在断点处停止并运行异步代码 它实际上不会完成 直到您恢复执行为止 这是一个问题 调试器允许您快速试验多个 api 方法 但如果您恢复它 您就不能 debugger now type the follo
  • Oo 任何 IDE 中的 javascript 代码补全

    你知道有什么IDE可以自动完成这种代码吗 我这里有一个 javascript 类生成器 function var core bind function method scope if method instanceof Function t
  • 取消html5浏览器中的单图请求

    我正在动态加载 大 图像以绘制到 html5 画布中 如下所示 var t new Image t onload t src http myurl 但每隔一段时间就会想取消图片请求完全地 我想出的唯一方法是设置src to i e t sr
  • 如何使用 selenium 和 Mocha 获取 xPath() 选择的锚标记的文本

    我已经成功选择了 a 标签 我想显示锚标记的文本 但无法这样做 我正在使用 selenium mocha javascript 和 phantomJS 这是我的脚本 详细 var assert require assert var test
  • VBA / HTML / jQuery 选择自动完成 - 在列表中选择

    我正在尝试使用 Excel 中的 VBA 在网站的列表中选择一个值 这不是一个 正常列表 该网站使用 jQuery 选择自动完成 如下所示 example http davidwalsh name demo jquery chosen ph
  • 如何在ASP.NET Webform中使用Jquery表单插件?

    我遇到了这个插件 http malsup com jquery form getting started http malsup com jquery form getting started 我想知道如何在 ASP NET WebForm
  • 如何使用 JavaScript 中的值填充下拉列表?

    我在 Tridion CMS 扩展中的功能区工具栏按钮中添加了一个按钮 单击该按钮后 将显示一个弹出页面 其中包含两个下拉菜单 通过更改第一个下拉控件中的值 我应该填充第二个下拉控件的值 就我而言 我正在使用ASP drop down li
  • 非 DOM 对象上的 jQuery 自定义事件

    我最近阅读了一些代码 其功能如下 bob name Bob Smith rank 7 bob bind nameChanged function bob trigger nameChanged 这似乎有效 但我在 jQuery 文档或源代码
  • 如何使用canvas.toDataURL()将画布保存为图像?

    我目前正在构建一个 HTML5 Web 应用程序 Phonegap 本机应用程序 我似乎不知道如何将画布保存为图像canvas toDataURL 有人可以帮我吗 这是代码 有什么问题吗 我的画布被命名为 canvasSignature J
  • 如何使用 jest 模拟第三方库

    我正在开发一个node js应用程序使用nestjs我有一堂课叫LoggerService如下 export class LoggerService private logger Rollbar constructor this logge
  • 通过 node-http-proxy 保留基于 cookie 的会话

    我有一个简单的基于 Express 的 Node js Web 服务器 用于开发 JavaScript 应用程序 我将服务器设置为使用 node http proxy 来代理应用程序向在不同域和端口上运行的 Jetty 服务器发出的 API
  • 在d3.js中将2D形状转换为3D,并根据ANGULAR中的值调整高度

    我正在使用 d3 js v6 创建以下 2D 图表表示的 3D 图表 这个圆圈中有多个正方形 每个正方形都根据值分配了一种颜色 值越大 正方形越暗 现在我想将其转换为 3D 形状 其中当值变高时 只有特定正方形的高度会增加 因此结果在某种程
  • 如何在 Angular 中从父组件访问子组件?

    I have mat paginator在子组件a中 如下所示 子组件 html
  • 如何使JavaScript函数在Eclipse“大纲视图”中可见?

    我有这样的代码 但如果它在匿名函数中定义 则无法打开函数大纲 类没有问题 我该如何概述something2 请分享一些提示 我可以将所有函数标记为构造函数 但这是无效的方法 start of track event required deb
  • JavaScript onresize 事件多次触发

    我在尝试仅在触发 onresize 事件时运行一次函数时遇到一些麻烦 我已经看过这个问题DOM onresize 事件 https stackoverflow com questions 1500312 javascript onresiz
  • 数据表日期范围过滤器

    如何添加日期范围过滤器 like From To 我开始进行常规搜索和分页等工作 但我不知道如何制作日期范围过滤器 我正在使用数据表 1 10 11 版本 My code var oTable function callFilesTable
  • 需要有关 React Js 的帮助

    我是 React Js 新手 我的代码无法正常工作 请看下面 这是我的脚本文件Main jsx 该文件由 React 编译 输出放置在 dist 文件夹下的 main js 文件中 var react require react react
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没
  • 在 GWT 中,在任何主机页标记上添加事件处理程序

    我想为任何标签添加 MouseOver 事件处理程序 举个例子 我想为旧版 HTML 页面中的每个锚点页面添加事件处理程序 继GWT指南 http code google com webtoolkit doc 1 6 DevGuideUse

随机推荐