1

我想使用 NodeJS 子进程运行 Java 程序。

const util = require('util');
const exec = util.promisify(require('child_process').exec);

let dir = `${__dirname}/runtime/java/main`;

await exec(`javac Test.java`, {cwd: dir});
const { stdout, stderr } = await exec(`java Test`, {cwd: dir});

我的 Java 代码动态地采用多个扫描仪运行时参数:

import java.util.Scanner; 

class Test {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);  
    System.out.println("Enter number of test cases");

    int count = scanner.nextInt();  
    for(int i=0; i<count; i++){
      String testCaseDescription = scanner.nextLine();  
      System.out.println("Test case " + i + " is "+testCaseDescription);  
    }

  }
}

如何将动态运行时参数传递给子进程?

4

1 回答 1

0

根据 的文档child_process.exec()给函数的第一个参数是“要运行的命令,带有空格分隔的参数”。

因此,我们需要获取提供给 Node.js 脚本的命令行参数并将它们传递给exec(). process.argv在 Node.js 中,我们可以通过属性获取这些参数(更多信息请参见此处)。

process.argv是一个数组,您需要排除第一个元素(即执行文件的 Node.js 运行时的路径)以及第二个元素(即 Node.js 脚本的路径)。您可以使用该slice() 方法仅获取所需的数组部分。

然后,您需要将数组(减去前两个元素)转换为以空格分隔的字符串。您可以通过使用join() 方法来做到这一点。

最终结果将如下所示:

const util = require('util');
const exec = util.promisify(require('child_process').exec);

async function run() {
    const dir = `${__dirname}/runtime/java/main`;
    await exec(`javac Test.java`, {cwd: dir});

    // Transforming the CLI arguments into a comma-separated string
    const cliArguments = process.argv.slice(2).join(' ');
    // Executing and passing the CLI arguments
    const { stdout, stderr } = await exec(`java Test ${cliArguments}`, {cwd: dir});
}

run();

于 2019-08-02T22:48:25.070 回答