javascript - 使用 Rhino 和 Rhinodo 从 Java 使用 NodeJS 库

标签 javascript java node.js rhino

我正在尝试使用 Javascript 库 multilang-extract-comments因此我决定使用 Rhino 作为 Javascript 引擎,并使用 Rhinodo 来连接 Rhino 和 NodeJS。然而,我不知道如何实际使用Rhinodo。我查看了使用Rhinodo(用于早午餐、jshint 和课间休息的 Maven 插件)的项目的代码,但我发现代码非常晦涩难懂。我尝试实现如下代码(对我的应用程序进行了一些编辑):

rhinodoBuilder
            .destDir(rhinodoDestDir)
            .moduleFactory(nodeModuleProvider)
            .consoleFactory(wrappingConsoleFactory)
            .env(env)
            .build(new BaseFunction() {
                @Override
                public Object call(Context cx, Scriptable scope, Scriptable thisObj, Object[] args) {
                    Scriptable brunch = (Scriptable) ScriptableObject.callMethod(cx, scope, "require",
                            new Object[]{Context.javaToJS("brunch", scope)});

                    Scriptable options = cx.newObject(scope);
                    ScriptableObject.putProperty(options, "minify", minify);
                    System.setProperty("user.dir", userDir.getAbsolutePath());

                    ScriptRuntime.doTopCall(ScriptableObject.getTypedProperty(brunch, "build", Function.class),
                            cx, scope, thisObj, new Object[]{
                            options,
                            new BaseFunction() {
                                @Override
                                public Object call(Context cx, Scriptable scope, Scriptable thisObj, Object[] args) {
                                    return Undefined.instance;
                                }
                            }
                    });

                    return Undefined.instance;
                }
});

(来自 brunch maven 插件)

但是,这段代码对我不起作用。我要么在尝试查找我的 Javascript 库时遇到错误,要么当我使用它应该能够找到的库时(我使用 fs 作为示例),我收到 NullPointerException。有人可以告诉我我在这里缺少什么吗?

注意:Rhinodo 和使用它的 Maven 插件都可以在 MuleSoft's GitHub Repositories 中找到。

最佳答案

我没有找到解决这个问题的方法。然而,如果其他人决定以这种方式使用 Rhinodo,部分问题是我实际上并没有使用 NodeModuleProvider。为了尝试加载所需的 Node 模块,我使用了类似于以下的代码:

// create a module provider for all the node modules in META-INF
String prefix = "META-INF/node_modules/";
String[] moduleNames = {"amodule","anothermodule","modulethethird"};
ArrayList<NodeModuleImpl> moduleList = new ArrayList<NodeModuleImpl>();

for (String module: moduleNames) {
    moduleList.add(NodeModuleImplBuilder.fromFolder(prefix+module));
}
NodeModuleProviderImpl nmp = new NodeModuleProviderImpl(moduleList);

然后,我在 RhinodoBuilder.moduleFactory() 方法中使用了 NodeModuleProvider(您可以在问题中的代码片段中看到它的使用)。但是,请注意,您可能必须解决我无法解决的问题:稍后使用从 Rhino 导入的模块。

最后,我认为使用 exec 将我的 javascript 调用为命令更有意义,因此我建议任何其他进行类似操作的人都使用该解决方案。

关于javascript - 使用 Rhino 和 Rhinodo 从 Java 使用 NodeJS 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44554990/

相关文章:

node.js - 在 emacs 中启动 Node REPL

javascript - 使用 Google Analytics 自定义事件作为反馈表

javascript - 查找 d3 中多个数据维度的范围

c# - 不完整的消息(C# TCP/IP 客户端)

java - 封装在Java模型类中

java - 将证书添加到 com.sun.net.httpserver.HttpsServer

node.js - 通过 Electron js 应用程序的 headless 浏览器自动化应用程序

javascript - Mapbox 方向 : how to extract directions data from result

php - 根据列表验证邮政编码

node.js - 从另一台计算机向 Express.js api 发送请求