2016-07-27 22 views
0

Wenn ich folgenden Code laufen bekomme ich Ausgang:Wie kann ich eine Methode von Nashorn mit einer webpack js Datei aufrufen?

simple.js

Exception in thread "main" java.lang.NoSuchMethodException: Keine solche Funktionsdefinition

Wie kann ich Rufen Sie die 'Definition' Funktion in meiner Webpack js Datei mit invokeFunction auf?

Java Haupt:

public static void main(String[] args) throws ScriptException, NoSuchMethodException { 
     ScriptEngine jsEngine = new ScriptEngineManager().getEngineByName("nashorn"); 

     Compilable jsCompilable = (Compilable) jsEngine; 
     CompiledScript jsScript = jsCompilable.compile(getBasicScript()); 

     ScriptContext scriptCtxt = jsEngine.getContext(); 
     Bindings engineScope = scriptCtxt.getBindings(ScriptContext.ENGINE_SCOPE); 
     jsScript.eval(engineScope); 

     Invocable jsInvocable = (Invocable) jsEngine; 
     jsInvocable.invokeFunction("definition", "mark"); 
    }  

Webpack Datei in getBasicScript() aufgerufen:

/******/ (function(modules) { // webpackBootstrap 
/******/ // The module cache 
/******/ var installedModules = {}; 

/******/ // The require function 
/******/ function __webpack_require__(moduleId) { 

/******/  // Check if module is in cache 
/******/  if(installedModules[moduleId]) 
/******/   return installedModules[moduleId].exports; 

/******/  // Create a new module (and put it into the cache) 
/******/  var module = installedModules[moduleId] = { 
/******/   exports: {}, 
/******/   id: moduleId, 
/******/   loaded: false 
/******/  }; 

/******/  // Execute the module function 
/******/  modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 

/******/  // Flag the module as loaded 
/******/  module.loaded = true; 

/******/  // Return the exports of the module 
/******/  return module.exports; 
/******/ } 


/******/ // expose the modules object (__webpack_modules__) 
/******/ __webpack_require__.m = modules; 

/******/ // expose the module cache 
/******/ __webpack_require__.c = installedModules; 

/******/ // __webpack_public_path__ 
/******/ __webpack_require__.p = ""; 

/******/ // Load entry module and return exports 
/******/ return __webpack_require__(0); 
/******/ }) 
/************************************************************************/ 
/******/ ([ 
/* 0 */ 
/***/ function(module, exports) { 

    print('simple.js'); 

    function definition(name) { 
     print('Hello: ' + name); 
    } 

/***/ } 
/******/ ]); 

Antwort

1

Das Problem scheint zu sein, dass die definition Funktion nicht in der obersten Ebene Gültigkeitsbereich deklariert wird. Es wird innerhalb einer anonymen Funktion deklariert (die selbst als Argument an die Funktion "main" übergeben wird). Unabhängig davon, was in der Hauptfunktion passiert, ist die definition-Funktion für ihre umschließende Funktion praktisch privat (beginnend bei Zeile 45).

Wenn Sie eine Funktion über die Invocable-Schnittstelle aufrufen möchten, muss sie global (in der obersten Ebene) entweder als Funktionsdeklaration oder als var-Anweisung deklariert werden.

+0

Danke - Sie haben Recht: Ich js Namespace Probleme hatte. Für den Fall, dass jemand darüber stolpert, habe ich meinen Webpack-Befehl folgendermaßen geändert: 'webpack ./simple.js bundle.js --output-library server --ausgabebibliothek-target umd' Dann aufgerufen: 'jsInvocable.invokeFunction (" server "," mark ");' – mryan

0

Hier ist eine andere Art und Weise ein webpack Baustein mit invokeMethod statt invokeFunction zu verwenden:

val root = engine.eval("root") // 'root' being your output.library 
engine.invokeMethod(root, "methodName", ...)