如何从NodeJs调用Java程序

如何从NodeJs调用Java程序,java,node.js,Java,Node.js,我有一个Java程序,通常从命令行开始。从命令行启动后,java程序将一直运行,直到按下Ctrl+C退出它或从另一个脚本终止命令。Java程序将错误消息(如果有)输出到控制台 现在我想开发基于express的NodeJs web应用程序。当用户单击链接(运行)时,单击处理程序将调用Ajax请求,这将导致后端NodeJs脚本运行该Java程序(如果尚未运行)。另一个链接(Stop)将发出Ajax请求来停止这个Java程序 如何做到这一点?答案与样本代码将是最有用的 还有一个要求:如果该NodeJs

我有一个Java程序,通常从命令行开始。从命令行启动后,java程序将一直运行,直到按下Ctrl+C退出它或从另一个脚本终止命令。Java程序将错误消息(如果有)输出到控制台

现在我想开发基于express的NodeJs web应用程序。当用户单击链接(运行)时,单击处理程序将调用Ajax请求,这将导致后端NodeJs脚本运行该Java程序(如果尚未运行)。另一个链接(Stop)将发出Ajax请求来停止这个Java程序

如何做到这一点?答案与样本代码将是最有用的


还有一个要求:如果该NodeJs web应用程序被终止,由其启动的Java程序将继续运行,即它不依赖于NodeJs web应用程序。

您可以启动子进程,并在不需要时发送终止信号

var spawn = require('child_process').spawn;
var child = spawn('java', ['params1', 'param2']);
要终止应用程序或模拟CTRL+C,请发送一个信号:

// control + c is an interrupt signal
child.kill('SIGINT');

// or send from the main process
process.kill(child.pid, 'SIGINT');
如果要独立运行应用程序,可能应该在某个地方编写PID。要运行分离的应用程序,请按如下方式运行:

var fs = require('fs');
var out = fs.openSync('./out.log', 'a');
var err = fs.openSync('./out.log', 'a');

var child = spawn('java', [], {
  detached: true,
  stdio: [ 'ignore', out, err ]
});
child.unref();

这将生成一个子进程,其I/O流与父进程不关联。

通常生成的子进程即使在父进程退出时也不会结束。要终止子进程,需要将子进程pid记录在某个位置(在一个文件中,以允许该值存在,即使父进程退出),并且在需要时也可以使用该pid终止子进程

您可以使用module调用带有类路径和参数的java命令,这不是的副本吗?作为的副本结束的问题似乎不太匹配;这有一个示例代码的答案,而另一个只是讨论了两种方法之间的权衡,没有说明如何做。我投票赞成重新开放,我也投票赞成重新开放。如果有什么,目标应该作为这篇文章的副本关闭。非常有用,谢谢!我不确定是否使用exec或spawn,因为我认为spawn不会创建一个新进程,而是由运行nodejs代码的进程拥有的东西。但现在看来,spawn中的分离功能将解决这一问题。有没有一种方法可以异步侦听某人从java应用程序端向stdin写入内容?@endy你的意思是什么?在我的用例中,我使用Node.js作为工具,只需要调用一些java实用程序并等待回答。在这种情况下,
execFileSync
spawn
更合适(该方法还将stdout作为Node.js缓冲区返回,必须转换为字符串)。@TomášZáluský我对该方法感兴趣,你有例子吗?感谢这对于node.js不是真的。您必须传递'detached:true',这样子进程就不会与父进程一起退出。