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 值。路径是 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();
    }
}
    }

期待任何提示/指针。

谢谢,维姬

4

2 回答 2

8

那是因为你没有ProcessBuilder正确使用。Javadocs非常明确。

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

ProcessBuilder svnProcessBuilder = new ProcessBuilder("svn", "--version");
于 2012-03-10T04:58:53.587 回答
2

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

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

有关更多详细信息和示例,请参阅ProcessBuilder 构造函数 JavaDoc

于 2012-03-10T04:55:21.070 回答