错误:Caused by: java.io.IOException: CreateProcess error=2, 系统找不到指定的文件。适用于所有可执行文件。

3
我的目标是在Java中运行SVN命令以满足我的要求,为此我已经安装了TortoiseSVN命令行工具,并将适当的路径“C:/ Program Files” / TortoiseSVN / bin“添加到我的环境”Path“变量中。
通过上述设置,我可以使用“svn --version”从Windows命令行运行我的svn命令,并且它完美地工作。
现在回到执行相同代码的问题,我正在使用processbuilder。但是我遇到了上述错误-java.io.IOException:无法运行程序“svn --version”:CreateProcess error = 2,系统找不到指定的文件。
我已经尝试过以下事情:
1. 使用ProcessBuilder.environment检查了Path和PATH值。 Path为空,但PATH已配置所有必要的应用程序路径,包括“TortoiseSVN / bin”路径。因此,这清除了ProcessBuilder没有可执行位置的路径理论。
2. 在执行时,我尝试给出完整的路径,即“C:/ Program Files / TortoiseSVN / bin / svn.exe”。那也给出了相同的错误。
3. 我尝试了与“java -version”等其他可执行文件相同的代码,但也失败了,并出现了相同的异常。
我现在有一种感觉,似乎有些基本的东西不对。但是我已经花了一天以上的时间来思考这个问题,但我没有得到任何线索。
好吧,再说一件事,我在Windows 7框中运行它。
以下是我正在使用的代码:
    import java.io.BufferedReader;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;

    public class RunningExecutable {

public static void main(String[] args){
    String command = "svn --version";

    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    try {           
        ProcessBuilder svnProcessBuilder = new ProcessBuilder(command);
        String PATH = svnProcessBuilder.environment().get("PATH");
        System.out.println("PATH - " + PATH);

        String path = svnProcessBuilder.environment().get("Path");
        System.out.println("Path - " + path);

        Process procObject = svnProcessBuilder.start();

        BufferedReader cmdStreamReader = new BufferedReader(new InputStreamReader(procObject.getInputStream()));
        String cmdOutput;
        while ((cmdOutput = cmdStreamReader.readLine()) != null) {
            outputStream.write((cmdOutput + "\n").getBytes());
        }
        System.out.println("O/p - " + outputStream.toString());
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Throwable th) {
        th.printStackTrace();
    }
}
    }

期待任何提示/指引。

谢谢, Vicky

2个回答

8
因为您没有正确使用ProcessBuilder Javadocs 非常清晰明了。
您不能将--version参数作为要调用的进程名称的一部分传递;这不是进程的文件名。在幕后,您直接执行进程 - 没有外壳涉及。
ProcessBuilder svnProcessBuilder = new ProcessBuilder("svn", "--version");

1
该死,我对此感到非常沮丧。我以与Runtime.exec相同的方式传递了参数,它接受一个单一字符串命令。无论如何,谢谢大家。 - Victor

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接