Вы можете использовать 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
, что и выше.