2012-03-10 51 views
3

我的目标是从我的需求之一运行Java的SVN命令,因为我已经安装了TortoiseSVN命令行工具。在我的环境“Path”变量中添加了适当的路径“C:/ Program Files”/ TortoiseSVN/bin错误:导致:java.io.IOException:CreateProcess错误= 2,系统找不到指定的文件。适用于所有可执行文件

通过以上设置,我可以使用“svn --version”来运行我的svn命令“它工作得很好。

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

我尝试下面的事情已经,

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

  2. 执行时,而不是只是svn --version我试着给出完整的路径,即“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(); 
    } 
} 
    } 

期待任何提示/指针都没有。

感谢, 玉萍

回答

8

这是因为您没有正确使用ProcessBuilderJavadocs非常清晰。

您不能将--version参数作为您尝试调用的进程名称的一部分;这不是流程的文件名。在幕后你直接执行一个流程 - 不涉及任何外壳。

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

该死的,我对此感到非常沮丧。我使用与Runtime.exec相同的方式传递参数,它使用单个字符串命令。无论如何,谢谢你们。 – Vicky 2012-03-10 16:01:09

相关问题