2017-06-14 29 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作爲一個命令更有意義,所以我建議任何承擔類似事情的人都使用該解決方案。