从Node.js应用程序调用java程序

时间:2017-04-11 19:20:32

标签: java node.js express

根据我的阅读,有几种方法可以在self.init应用程序中运行java个文件。一种方法是生成子进程:( java代码与可执行文件node.js中的依赖项打包在一起。)

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); } }); 模块(link),java - npm上的包装(这将让我创建JNI,设置并获取{{1 },运行objects)。

在生产环境中,当我希望我的attributesmethods)服务器调用node.js程序时(它只是将图像保存到本地目录中),请告诉我这是实现这一目标的更好方法(就最佳实践而言)。此外,我需要传递给Express类的java长列表,并且在命令行上执行此操作有点困难。我应该从输入文件中读取arguments程序吗?

5 个答案:

答案 0 :(得分:4)

1)如果您使用exec,您将运行整个程序,而如果您使用JNI接口,您将能够直接与jar中的库和类进行交互,并执行诸如调用之类的操作单个函数或创建类的实例。但是,如果您不需要这样的东西,我认为使用exec要简单得多,而且运行速度也会更快。听起来您只想将Java应用程序作为独立进程运行,只需记录应用程序是成功完成还是有错误。我会说最好只使用exec。以这种方式执行子进程对于调试来说也好得多,有时调试JNI错误可能非常困难。

2)至于是否从文件中读取参数,是的,通常最好从某种文件中读取而不是直接传入参数。它不容易出现人为错误(即每次都输入参数),而且更容易配置。如果像QA工程师这样的人只需要编辑配置文件来交换选项,他们就不需要了解整个代码库来测试它。就个人而言,我为每个编写的Java程序使用配置文件。

答案 1 :(得分:0)

您可以使用部署工具包并通过jnlp运行jar。 https://docs.oracle.com/javase/8/docs/technotes/guides/deploy/deployment_toolkit.html 通过jnlp运行jar的优点是能够将参数从javascript传递到jar。通过这种方式,您可以动态自定义您的Java程序。

答案 2 :(得分:0)

对于这种类型的问题,您希望以下列方式接近它:

  • 在我的语言/框架中使用参数运行进程是否有一个不错的方法
  • 有没有一个合适的方式来处理程序输出?

根据经验,处理过程中参数的一种不错的方法是将它们作为(字符串)数组传递。这是有利的,因为您不必采用不必要的字符串插值和操作。它也更具可读性,在这个问题设置中也是一个优点。

处理输出的一个不错的方法是使用基于侦听器/事件的模型。这样,您可以对事件做出适当的响应,而不是为stderr和stdout设置if块。同样,这使得事物可读,让你以更易于维护的方式处理输出。

如果你再深入研究一下,你还必须解决如何将环境变量注入目标程序的问题。例如,您可能希望将来使用调试器或更少内存来运行java,因此您的解决方案也需要满足此要求。

这只是解决这个问题的一种方法。如果node是您的平台,那么请查看支持所有这些技术的Child Process

答案 3 :(得分:0)

我们可以通过创建它的.jar文件来运行整个Java项目,并使用Shell中的命令运行它并运行该Shell文件。为了从nodejs项目运行Java代码,我们知道项目可以是java,js模块的混合。 在节点中调用exec()函数以创建一个子进程来执行具有命令以运行.sh文件的外壳文件,并且还可以从use.eg;中传递一些参数。

let fileName = 'someFile.txt';
let userName = 'Charlie Angle'; 
exec(`sh run.sh --context_param
paramFilePath="./storage/${fileName}" --context_param userName="${userName}"`, (error, stdout, stderr) => {// Some code based on execution of above command})

答案 4 :(得分:0)

您可以使用node-java-caller模块简单地调用带有类路径和参数的java命令,它将调用嵌入到spawn中,并且如果系统中不存在java,它也会自动安装

https://github.com/nvuillam/node-java-caller