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

从我读到的,有几种方法可以在node.js应用程序中运行java文件。 一种方法是产生一个subprocess:(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模块( 链接 ),一个JNI封装(这会让我创buildobjects ,设置和获取attributes ,运行methods )。

在生产环境中,当我想让我的node.jsExpress )服务器调用一个java程序(它只是将图像保存到本地目录)时,请告诉我哪个更好的方法来完成这个最佳实践)。 另外,我需要传递给main类的一长串arguments ,而在命令行上这样做是有点困难的。 我应该让java程序从input文件中读取吗?

1)如果你使用exec ,你将运行一个完整的程序,而如果你使用JNI接口,你将能够直接与jar中的库和类进行交互,做一些事情,比如调用一个函数或创build一个实例一类。 但是,如果你不需要这样的东西,我认为使用exec会简单得多,而且运行速度也会更快。 听起来就像你只是想将Java应用程序作为一个独立的进程运行一样,只是logging应用程序是成功完成还是有错误。 我会说这只是使用exec可能会更好。 以这种方式执行subprocess对于debugging来说也是好得多,有时debuggingJNI错误可能会非常困难。

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

您可以使用部署工具包并通过jnlp运行jar。 https://docs.oracle.com/javase/8/docs/technotes/guides/deploy/deployment_toolkit.html通过jnlp运行jar的好处是能够将参数从javascript传递到jar。 这样你可以dynamic地自定义你的java程序。

对于这种types的问题,您可能希望以如下方式处理:

  • 有没有一种体面的方式来运行在我的语言/框架的参数进程
  • 有没有一个体面的方式来处理程序输出?

根据经验,处理过程中参数的体面方法是将它们作为(string)数组传递。 这是有利的,因为你不必诉诸不必要的string插入和操纵。 这也是更可读性,这是在这个问题设置加。

处理输出的体面方式是使用基于监听器/事件的模型。 通过这种方式,您可以对事件作出适当的响应,而不是像stderr和stdout那样使用块。 再次,这使得事情可读,让我们以更可维护的方式处理输出。

如果再深入一点,还需要解决如何将环境variables注入到目标程序的问题 。 作为一个例子,您可能希望将来使用debugging器或更less的内存运行java,所以您的解决scheme也需要迎合这一点。

这只是解决这类问题的一种方法 。 如果节点是您的平台,那么请查看支持所有这些技术的subprocess 。

试试这个到nodejs文件中:
https://www.npmjs.com/package/java
或者这个到html响应文件中:
<object width="400" height="400" data="helloworld.swf"></object>不方便的是只读取.swf文件……除了你joinjavatypes: