2016-07-27 2 views
0

Если я запускаю следующий код, который я получаю выход:Как я могу вызвать метод из Nashorn с помощью js-файла webpack?

simple.js

Исключение в потоке "основной" java.lang.NoSuchMethodException: Нет такого определения функции

Как я могу вызвать функцию 'definition' в моем файле jspackack с помощью invokeFunction?

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-statement.

+0

спасибо - вы правы: я имел проблемы JS пространства имен. Если кто-то наткнулся на это, чтобы заставить его работать, я изменил команду webpack на: 'webpack ./simple.js bundle.js --output-library server --output-library-target umd' Затем вызывается: 'jsInvocable.invokeFunction (" server "," mark ");' – mryan

0

Вот еще один способ использовать встроенный модуль WebPack с использованием invokeMethod вместо invokeFunction:

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

 Смежные вопросы

  • Нет связанных вопросов^_^