2016-07-27 15 views
0

私は次のコードを実行した場合、私は出力を得る:webpack jsファイルでNashornからメソッドを呼び出すにはどうすればよいですか?

simple.js

スレッド "メイン" java.lang.NoSuchMethodExceptionの例外:いいえ、そのような関数定義

どのようにすることができますinvokeFunctionを使用して私のwebpack jsファイルの '定義'関数を呼び出しますか?メイン

のJava:

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 getBasicScriptに呼ばれるファイル():

/******/ (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); 
    } 

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

答えて

1

問題がdefinition関数はトップレベルのスコープで宣言されていないことのようです。それは無名関数の中で宣言されます(それ自体が "main"関数の引数として渡されます)。メイン関数で何が起こっても、definition関数は、(45行目から)その囲み関数に対して実際にはプライベートです。

あなたがのInvocableインタフェースを介して機能を呼び出したい場合は、それがいずれかの関数の宣言やVAR文として(最上位レベルのスコープで)グローバルに宣言する必要があります。ここで

+0

おかげ - あなたは正しい:私は、JSの名前空間の問題を持っていました。誰かがこの問題を抱えている場合、私はwebpackコマンドを次のように変更しました。 'webpack ./simple.js bundle.js --output-library-server-output-library-target umd' 次に、 'jsInvocable.invokeFunction(" server "、" mark ");' – mryan

0

ではなくinvokeFunctioninvokeMethodを使用して構築されたWebPACKのモジュールを使用する別の方法です:

val root = engine.eval("root") // 'root' being your output.library 
engine.invokeMethod(root, "methodName", ...) 
関連する問題