2012-03-10 64 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

相關問題