java命令在节点js子进程exec中失败但在命令行上成功

时间:2018-05-20 15:14:27

标签: java node.js runtime-error openxml child-process

我正在尝试使用节点JS子进程exec包运行以下命令:

java -Duser.dir=/app/system/controllers/ -jar -Xmx2048m -XX:-UseGCOverheadLimit "/app/system/controllers/validation/dist/Validation.jar" "load" "ATC" "/app/system/controllers/validation/test files/uploadedfile1.xlsx" "/app/system/controllers/validation/test files/uploadedfile2.xlsx"

以下是我如何称呼它:

var exec = require('child_process').execSync;

var child = exec('java -Duser.dir=/app/system/controllers/ -jar -Xmx2048m -XX:-UseGCOverheadLimit "/app/system/controllers/validation/dist/Validation.jar" "load" "ATC" "/app/system/controllers/validation/test files/uploadedfile1.xlsx" "/app/system/controllers/validation/test files/uploadedfile2.xlsx"', function (error, stdout, stderr){
                if(error){
                    console.log("The error is: ",error);
                }
            });

出于某种原因,当我这样称呼它时,会出现以下错误:

Error: Command failed: java -Duser.dir=/app/system/controllers/ -jar -Xmx2048m -XX:-UseGCOverheadLimit "/app/system/controllers/validation/dist/Validation.jar" "load" "ATC" "/app/system/controllers/validation/test files/uploadedfile1.xlsx" "/app/system/controllers/validation/test files/uploadedfile2.xlsx"
Exception in thread "main" org.apache.poi.openxml4j.exceptions.NotOfficeXmlFileException: No valid entries or contents found, this is not a valid OOXML (Office Open XML) file
    at org.apache.poi.openxml4j.opc.ZipPackage.getPartsImpl(ZipPackage.java:290)
    at org.apache.poi.openxml4j.opc.OPCPackage.getParts(OPCPackage.java:774)
    at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:344)
    at org.apache.poi.util.PackageHelper.open(PackageHelper.java:37)
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:285)

但是,当我通过命令行通过简单地复制和粘贴它来运行它时,它完全正常。为什么会发生这种情况会有一个简单的解释吗?我是否在子进程调用中调用了错误的内容?

1 个答案:

答案 0 :(得分:0)

我知道这个问题已经问了两年了。但是,我最近遇到了同样的问题,发现如果您在项目主目录中创建Shell文件,则可以使用spawn函数调用它。您只需要提供至少一个参数即可使其工作。

即使没有将Shell脚本设置为处理自变量,也是如此。否则,出于某种原因,它将ENOENT放在命令的末尾。我目前在移动设备上,但稍后会对其进行编辑以提供代码示例。