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

Runtime.getRuntime().exec()导致java.io.IOException:无法运行程序。。。没有这样的文件或目录,java,spring,process,openssl,runtime,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] = St

您好,我正在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()

标题为“无法执行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
标题为“无法执行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

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

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

不需要运行一系列命令。它采用一个描述单个命令的数组

这意味着依赖于系统,但通常数组中的第一个元素是要运行的命令,后续元素描述其参数。例如,如果您想将
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
)视为程序,将其余令牌视为其参数。但这种功能是外壳的一部分,而不是底层操作系统
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
)视为程序,将其余令牌视为其参数。但这种功能是外壳的一部分,而不是底层操作系统
Runtime.exec与操作系统对话,因此您需要自己进行分割。

只需完整路径选择要运行的cmd: 例如:“node-e index.js”==>“/path/to/node-e/path/to/index.js” 这是给我的,
在我的例子中,节点位于PATH中,但我不知道为什么它不起作用 例如:“node-e index.js”==>“/path/to/node-e/path/to/index.js” 这是给我的,
在我的例子中,节点在路径中,但我不知道它为什么不工作

错误很简单,没有找到键。为什么不尝试一个简单的钥匙位置呢。如果您在linux上,只需输入/home/username/Riksof.key即可。在异步任务中运行此任务是什么意思。运行它的方式已经是异步的,因为当linux命令执行时,除非调用waitFor()方法,否则您不知道它何时完成。这里的
path
name
是什么?您是否传递了正确的位置?是的,从上面的错误
/home/lalani/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/api server/WEB-INF/applications/certificate/
是路径,
Riksof
是名称。这也不是问题,因为从技术上讲,此文件不存在此命令
opensslgenrsa-out Riksof.key 2048
用于在当前位置生成名为
Riksof.key
的密钥文件,并且我可以访问此目录
/home/lalani/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpw‌​ebapps/api server/WEB-INF/applications/certificate/
使用cd,因此目录存在,以确保错误简单,找不到密钥。为什么不尝试一个简单的钥匙位置呢。你在linux上吗,然后是simp