2

我正在为 git 可执行文件创建一个简单的 Java 包装器,我想在我的应用程序中使用它。一个小代码示例:

public static void main(String[] args) {
        String gitpath = "C:/eclipse/git/bin/git.exe";
        File folder = new File("C:/eclipse/teste/ssadasd");
        try {
            folder.mkdirs();
            Runtime.getRuntime().exec(
                    gitpath + " clone git@192.168.2.15:test.git", null,
                    folder);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

代码永远不会结束执行.. 似乎它已经陷入了内部exec。如果我通过命令行运行 git clone,它会按预期工作。如果我从 github 尝试另一个存储库,例如,它也可以工作。

有人知道这里发生了什么吗?提前致谢

4

3 回答 3

2

Runtime.getRuntime().exec返回一个Process对象,您可以使用该对象与进程交互并查看发生了什么。我的怀疑是你只需要做这样的事情:

Process p = Runtime.getRuntime().exec(
    gitpath + " clone git@192.168.2.15:test.git", null,
    folder);
p.waitFor();

如果没有,你也可以做getErrorStream()getOutputStream()在过程中查看它写出的内容;这可能有助于调试。

于 2012-10-03T18:55:44.820 回答
2

这不是对您问题的直接回答,但您可能想看看JGit,它是 Git 操作的直接 Java 实现(不包装命令行 git)。JGit 得到了很多使用和稳定工作,因为它是 EGit(Eclipse Git 集成)的基础。

于 2012-10-03T18:57:43.420 回答
1

Runtime.exec()在各种情况下可能会导致挂起 - 请参阅引用Javadoc的这篇文章,其中说(在 JDK 7 中):

由于一些原生平台只为标准输入输出流提供有限的缓冲区大小,未能及时写入子进程的输入流或读取输出流可能会导致子进程阻塞,甚至死锁。

文章给出了一些示例解决方案,它们消耗了输出和错误流,虽然我认为 ProcessBuilder 类是在文章写完之后引入的,所以可能更令人满意:较新的 Javadoc 增加了:

如果需要,也可以使用 ProcessBuilder 类的方法重定向子进程 I/O。

于 2012-10-03T21:21:12.343 回答