2017-06-14 102 views
0

我试图在Java应用程序中使用Javascript库multilang-extract-comments,因此我决定使用Rhino作为Javascript引擎和Rhinodo来连接Rhino和NodeJS。但是,我无法弄清楚如何实际使用Rhinodo。我已经看过使用Rhinodo的项目的代码(早午餐,jshint和休息室的maven插件),但我觉得代码非常神秘。我试着像执行以下代码(有一些编辑我的应用程序):使用来自Java的使用Rhino和Rhinodo的NodeJS库

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; 
       } 
}); 

(从早午餐Maven插件)

然而,这个代码不为我工作。我在尝试查找我的Javascript库时遇到错误,或者当我使用库时应该能够找到(我使用fs作为示例),我得到一个NullPointerException。有人能告诉我我在这里错过了什么吗?

注:既Rhinodo和使用它的Maven插件可以在MuleSoft's GitHub Repositories

回答

0

发现我没有找到这个工作出路。但是,如果其他人决定以这种方式使用Rhinodo,那么问题的一部分就是我实际上没有使用NodeModuleProvider。为了尝试加载我需要的节点模块,我用类似下面的代码:()

// 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); 

然后我用了NodeModuleProvider在RhinodoBuilder.moduleFactory方法(你可以在我的代码片段看惯的问题)。但是,请注意,您可能需要解决以下问题:使用后期从Rhino导入的模块。

最后我决定用exec调用我的javascript作为一个命令更有意义,所以我建议任何承担类似事情的人都使用该解决方案。