有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

从节点调用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.jsExpress)服务器调用java程序(它只是将一个映像保存到本地目录)时,请告诉我哪种方法更适合实现这一点(就最佳实践而言)。另外,有一长串arguments我需要传递给main类,在命令行上这样做有点困难。我应该改为从输入文件读取java程序吗


共 (5) 个答案

  1. # 1 楼答案

    对于这类问题你应该用以下方式解决:

    • 在我的语言/框架中,有没有一种体面的方式来运行带有参数的进程
    • 有没有合适的方法来处理程序输出

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

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

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

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

  2. # 4 楼答案

    我们可以通过制作脚本来运行整个java项目。jar文件,并使用shell中的命令运行它,然后运行该shell文件。为了从nodejs项目中运行java代码,我们知道这个项目可以是java、js模块的混合体。 在节点中调用exec()函数,创建一个子进程,以执行要运行命令的shell文件。sh文件,也可以从使用中传递一些参数。例如

    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})
    
  3. # 5 楼答案

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

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