【问题标题】:How to call a java program from node.js? [duplicate]如何从 node.js 调用 java 程序? [复制]
【发布时间】:2015-11-09 10:11:14
【问题描述】:

我在同一个文件夹中有一个 node.js 脚本和一个 java 程序(.class 和 .java 和 .js)。我想从 node.js 脚本中调用 java 程序。在终端我可以像这样调用java程序

java -cp java-json.jar:. PlutoMake "tests/android.png"

我看到了这个帖子How to call Java program from NodeJs

我也在尝试做同样的事情,这里是 node.js 代码

var child = spawn('java', ['-cp java-json.jar:. PlutoMake', 'tests/android.png']);

这似乎在没有崩溃的情况下运行,但随后什么也没有发生。 java程序创建一个图像,但如果我通过节点来做,它就不起作用。有谁知道怎么回事?

谢谢

【问题讨论】:

    标签: javascript java node.js


    【解决方案1】:

    您传递的参数数组每个参数应该有一个元素。您错误地组合了其中的一些。

    var child = spawn('java', ['-cp', 'java-json.jar:.', 'PlutoMake', 'tests/android.png']);
    

    检查输出和退出代码可能很有用:

    child.on('close', function (exitCode) {
        if (exitCode !== 0) {
            console.error('Something went wrong!');
        }
    });
    
    // If you’re really just passing it through, though, pass {stdio: 'inherit'}
    // to child_process.spawn instead.
    child.stderr.on('data', function (data) {
        process.stderr.write(data);
    });
    

    【讨论】:

    • 这行得通,谢谢,但现在如何设置在 java 脚本退出或完成时运行的事件?
    • @sneaky:我编辑了关于检查退出代码是否有错误的答案,但这也是您用来继续的事件(在确认退出代码 0).
    • 在java中我知道我可以像system.exit(0)那样做,我认为这会触发上面的第一个函数。当java完成执行(不调用exit并且不抛出异常)时触发哪一个?还有上面的第二个函数是怎么触发的?
    • @sneaky: 0 表示成功。这是默认的退出代码。您无需致电 system.exit 即可使用。当子进程有错误输出时触发第二个事件。
    • 在我的用例中,我使用 Node.js 作为工具,它只需要调用一些 Java 实用程序并等待答案。在这种情况下,execFileSyncspawn 更合适(该方法也将标准输出作为 Node.js 缓冲区返回,必须将其转换为字符串)。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-09-07
      • 1970-01-01
      • 2015-09-26
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      相关资源
      最近更新 更多