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

时间:2012-03-10 04:49:16

标签: java eclipse executable processbuilder

我的目标是根据我的要求从java运行SVN命令,因为我已经安装了TortoiseSVN命令行工具。在我的环境“Path”变量中添加了相应的路径“C:/ Program Files”/ TortoiseSVN / bin。

通过上面的设置,我可以使用说“svn --version”从windows命令行运行我的svn命令,它完全正常。

现在回到执行相同的代码,我正在使用processbuilder。但是我最终得到了上面的错误 - java.io.IOException:无法运行程序“svn --version”:CreateProcess error = 2,系统找不到指定的文件。

我已经尝试了以下事情,

  1. 使用ProcessBuilder.environment检查Path和PATH值。 Path是emply,但是PATH配置了所有必需的应用程序路径,包括“TortoiseSVN / bin”路径。因此,清除ProcessBuilder理论的路径中没有可执行位置。

  2. 执行时,我试图给出完整的路径,即“C:/ Program Files / TortoiseSVN / bin / svn.exe”,而不仅仅是svn --version。这也给出了同样的错误。

  3. 我为其他可执行文件尝试了相同的代码,例如“java -version”,它也因同样的异常而失败。

  4. 我现在有一种非常基本的感觉是不对的。但是现在尝试了一天以上,但是我没有得到任何线索。

    还有一件事,我在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();
        }
    }
        }
    

    期待任何提示/指示。

    谢谢, 维基

2 个答案:

答案 0 :(得分:8)

这是因为你没有正确使用ProcessBuilderJavadocs非常明确。

您无法将--version参数作为您尝试调用的进程名称的一部分传递;那不是进程的文件名。在幕后你直接执行一个过程 - 没有涉及到shell。

ProcessBuilder svnProcessBuilder = new ProcessBuilder("svn", "--version");

答案 1 :(得分:2)

您需要将可执行文件与其参数分开:

new ProcessBuilder("svn", "--version")

有关详细信息和示例,请参阅ProcessBuilder constructor JavaDoc