【问题标题】:Using a NodeJS Library from Java using Rhino and Rhinodo使用 Rhino 和 Rhinodo 从 Java 中使用 NodeJS 库
【发布时间】:2017-06-14 21:26:47
【问题描述】:

我正在尝试在 Java 应用程序中使用 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找到

【问题讨论】:

    标签: javascript java node.js rhino


    【解决方案1】:

    我没有找到解决方法。但是,如果其他人决定以这种方式使用 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(您可以在问题中的代码 sn-p 中看到使用了该方法)。但是,请注意,您可能必须解决我无法解决的问题:稍后使用从 Rhino 导入的模块。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      相关资源
      最近更新 更多