从节点调用java程序。js应用程序
据我所知,有几种方法可以在node.js
应用程序中运行java
文件。一种方法是生成一个子进程:(java代码与可执行文件jar
中的依赖项打包在一起。)
var exec = require('child_process').exec, child;
child = exec('java -jar file.jar arg1 arg2',
function (error, stdout, stderr){
console.log('stdout: ' + stdout);
console.log('stderr: ' + stderr);
if(error !== null){
console.log('exec error: ' + error);
}
});
另一种方法是使用java - npm
模块(link),它是JNI
上的包装器(这将允许我创建objects
,设置并获取attributes
,运行methods
)
在生产环境中,当我希望我的node.js
(Express
)服务器调用java
程序(它只是将一个映像保存到本地目录)时,请告诉我哪种方法更适合实现这一点(就最佳实践而言)。另外,有一长串arguments
我需要传递给main
类,在命令行上这样做有点困难。我应该改为从输入文件读取java
程序吗
# 1 楼答案
对于这类问题你应该用以下方式解决:
根据经验,处理进程中的参数的一种好方法是将它们作为(字符串)数组传递。这是有利的,因为您不必求助于不必要的字符串插值和操作。它也更具可读性,这在这个问题设置中是一个优势
处理输出的一个好方法是使用基于侦听器/事件的模型。这样,您就可以适当地响应事件,而不是为stderr和stdout设置if块。同样,这使事情可读,让您以更易于维护的方式处理输出
如果您进一步深入了解这一点,您还必须解决一个问题,即如何将环境变量注入目标程序中。例如,您可能希望在将来使用调试器或更少内存运行java,因此您的解决方案也需要满足这一要求
这只是解决这类问题的一种方法。如果node是您的平台,那么看看Child Process,它支持所有这些技术
# 2 楼答案
您只需使用classpath&;参数,使用模块节点java调用者,它嵌入对spawn的调用,如果系统上没有java,它也会自动安装java
https://github.com/nvuillam/node-java-caller
# 3 楼答案
您可以使用部署工具包并通过jnlp运行jarhttps://docs.oracle.com/javase/8/docs/technotes/guides/deploy/deployment_toolkit.html 通过jnlp运行jar的优点是能够将参数从javascript传递到jar。通过这种方式,您可以动态定制java程序
# 4 楼答案
我们可以通过制作脚本来运行整个java项目。jar文件,并使用shell中的命令运行它,然后运行该shell文件。为了从nodejs项目中运行java代码,我们知道这个项目可以是java、js模块的混合体。 在节点中调用exec()函数,创建一个子进程,以执行要运行命令的shell文件。sh文件,也可以从使用中传递一些参数。例如
# 5 楼答案
1)如果您使用
exec
,您将运行整个程序,而如果您使用JNI接口,您将能够直接与jar中的库和类交互,并执行诸如调用单个函数或创建类实例之类的操作。然而,如果你不需要类似的东西,我认为使用exec
要简单得多,而且运行速度也会更快。听起来您只是想将Java应用程序作为一个独立的进程运行,并记录应用程序是否成功完成或出现错误。我认为用exec
来做这件事可能更好。以这种方式执行子进程对于调试来说也要好得多,调试JNI错误有时会非常困难2)至于是否从文件中读取参数,是的,通常最好从某种文件中读取,而不是直接传递参数。它不太容易出现人为错误(即每次输入参数),而且更易于配置。如果像QA工程师这样的人只需要编辑一个配置文件来交换选项,他们不需要了解整个代码库来测试它。就我个人而言,我编写的每个Java程序都使用配置文件