Runtime.getRuntime()。exec()导致java.io.IOException:无法运行程序...没有这样的文件或目录

时间:2016-05-09 06:51:24

标签: java spring process openssl runtime

您好我在Java和Spring框架中使用openssl生成证书和密钥,

以下是我的代码

String[] cmds = new String[4];
cmds[0] = String.format("openssl genrsa -out %s.key 2048", path+name);
cmds[1] = String.format("openssl req -new -key %s.key -out %s.csr", path+name, path+name);
cmds[2] = String.format("openssl x509 -req -in %s.csr -CA %s.pem -CAkey %s.key -CAcreateserial -out %s.crt -days 365 -sha512 -extensions mysection -extfile conf.cnf", path+name, path+rootName, path+rootName, path+name);
cmds[3] = String.format("openssl pkcs12 -export -out %s.pfx -inkey %s.key -in %s.crt", path+name, path+name, path+name);

Runtime r = Runtime.getRuntime();
Process p = null;
try {

    p = r.exec(cmds);

} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

作为回报我得到了关注

  

java.io.IOException:无法运行程序" openssl genrsa -out   /home/lalani/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/api-server/WEB-INF/applications/certificate/Riksof.key   2048":错误= 2,没有这样的文件或目录

请指导我做错了什么?

还请建议我如何在异步任务中运行此Runtime.getRuntime().exec()

4 个答案:

答案 0 :(得分:2)

Runtime.exec不会运行一系列命令。它需要一个描述单个命令的数组。

这意味着系统依赖,但通常数组中的第一个元素将是要运行的命令,后续元素描述其参数。例如,如果您想将foo.txt复制到bar.txt,则可以:

String[] cmd = { "cp", "foo.txt", "bar.txt" };
p = r.exec(cmd);

因此,您的代码尝试执行的操作是调用名为openssl genrsa -out /home/lalani/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/api-server/WEB-INF/applications/certificate/Riksof.key 2048的程序。它试图将三个参数传递给该程序,对应于数组的最后三个元素。但是那个程序不存在 - 如果有的话,这将是一个非常奇怪的程序!

要在数组中执行第一个命令,您需要一个类似的数组:

String[] cmd1 = { "openssl", "genrsa", "-out", path + name + ".key", "2048" };
p = r.exec(cmd1);

当然,你也需要为其他三个命令执行此操作。

文本在终端中工作的原因是shell实际占用了行,将其解析为其组件(基本上是通过拆分空格,将引用文本分解),处理第一个令牌(openssl)作为程序,其余的标记作为其参数。但是该功能是shell的一部分,而不是底层操作系统; Runtime.exec与操作系统进行对话,因此您需要自己进行拆分。

答案 1 :(得分:1)

Java无法找到程序openssl。您必须提供openssl可执行文件的完整路径,或确保openssl的路径位于Java程序可用的路径中。

答案 2 :(得分:0)

标题为“无法执行Runtime.getRuntime()”的问题,但此处的问题不是无法执行Runtime.getRuntime(),但是在执行p = r.exec(cmds);时,会抛出IO异常,因为

Cannot run program "openssl genrsa -out /home/lalani/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/api-server/WEB-INF/applications/certificate/Riksof.key 2048": error=2, No such file or directory

答案 3 :(得分:0)

只需将要运行的cmd全路径: 例如:“ node -e index.js” ==>“ / path / to / node -e /path/to/index.js” 它为我修复 就我而言,节点位于PATH中,但我不知道为什么它不起作用