как вызвать функцию Nodejs из java - PullRequest
1 голос
/ 12 июля 2020

Я хочу вызвать функцию node js из java:

вот мой привет. js javascript код:

function myFun(param)
{
     console.log("hello"+param);
}

вот мой java code:

public static void main(String[] args) throws IOException {
  Process process = new ProcessBuilder("C:\\Program Files\\nodejs\\node.exe","hello.js").start();
  InputStream is = process.getInputStream();
  InputStreamReader isr = new InputStreamReader(is);
  BufferedReader br = new BufferedReader(isr);
  String line;
  
  
  while ((line = br.readLine()) != null) {
    System.out.println(line);
  }
    }

С этим кодом java я могу выполнить файл hello. js, но я хочу вызвать функцию myFun и установить параметры в этой функции из java code .. is это возможно.

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Вы можете использовать GraalVM для вызова функции node.js из java.

GraalVM предлагает вам среду выполнения полиглота, а дистрибутив включает как JDK, так и узел.

Вы можете выполнить JavaScript из Java, встраивая контекст JavaScript в вашу Java программу, например:

import org.graalvm.polyglot.*;
import org.graalvm.polyglot.proxy.*;

public class HelloPolyglot {

    static String JS_CODE = "(function myFun(param){console.log('hello '+param);})";

    public static void main(String[] args) {
        System.out.println("Hello Java!");
        try (Context context = Context.create()) {
            Value value = context.eval("js", JS_CODE);
            value.execute(args[0]);
        }
    }
}

Обратите внимание на (), обертывающее определение функции, я просто хочу, чтобы он возвращал функция немедленно там. Вы можете использовать и другие способы , а не только код в String, Files, modules и т. Д. c.

И запускать его с GraalVM на PATH:

❯ javac HelloPolyglot.java
❯ java HelloPolyglot StackOverflow
Hello Java!
hello StackOverflow

Хотя это не является строго необходимым для этого вопроса, вот Javado c для класса Value , поэтому вы можете использовать значения полиглота.

Таким образом вы можете использовать JavaScript. У него не будет возможностей платформы node.js, таких как событие узла l oop, доступ к fs, et c, node - это отдельная платформа, и сложно встроить ее в процесс JVM.

Что вы можете сделать - это запустить процесс узла, который запустит JVM.

Представьте, что у вас есть приложение типа app.js

var HelloPolyglot = Java.type("HelloPolyglot");

HelloPolyglot.main(["from node.js"]);

console.log("done");

Затем вы можете запустить ( с узлом GraalVM):

❯ node --jvm --vm.cp=. app.js
Hello Java!
hello from node.js
done

Обратите внимание, что мы передаем --jvm, чтобы запустить его с JVM (в противном случае не будет возможности выполнить Java), и передаем путь к классам Java программа для узла, чтобы он знал, как правильно запустить JVM.

И узел, и JVM затем запускаются в одном процессе, и взаимодействие работает с использованием тех же классов Value, что и выше.

0 голосов
/ 12 июля 2020

Это не так просто. У вас есть несколько возможных методов для этого:

  1. Используйте JNI-привязки к V8 (Node.js - это просто V8 с большой библиотекой и небольшим количеством клея). передать аргументы.
  2. (Это не совсем то, что вы просили) Используйте Javascript -Engine, написанный на Java ( GraalVM )

Плюсы / Cons

  1. Имеет то преимущество, что может дать вам большой контроль (==> Более гибкий), но написание JNI сложно, подвержено ошибкам и требует много времени.
  2. - самое простое, но не такое гибкое решение.
  3. , возможно, другое решение, которое может превосходить 1. (Нет необходимости поставлять собственные библиотеки) и 2. (Очень fr agile, т.к. вам нужно указать c расположение для node.exe).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...