0

我使用 groovy 编写了一个自定义 gradle 插件来执行基本的 svn 任务,例如 Checkout、Clean、Tag 等。groovy 类调用 svn 命令行客户端来执行这些操作,当我在我的 Windows 系统上运行它时它工作正常但同样当我在 linux 系统 (Centos) 上运行插件时,它会出现以下错误。

svn: E170000: '%22https://source.mycompany.net/svn/MyProject/trunk%22' 的 URL 方案无法识别

我能够通过命令提示符或 shell 脚本对命令行客户端进行相同的调用,而不会出现任何问题。那么和有什么区别

这是我的代码示例:

    String command =String.format("svn co -r %d  --non-interactive --trust-server-cert --          username %s --password %s --depth infinity \"%s\" \"%s\"",
                                          getRevision(),
                                          getUserName(),
                                          getUserPassword(),
                                          getSrcUrl(),
                                          getDir());

    Process svnProcess = Runtime.getRuntime().exec(command);

    BufferedReader stdInput = new BufferedReader(new     InputStreamReader(svnProcess.getInputStream()));
BufferedReader stdError = new BufferedReader(new  InputStreamReader(svnProcess.getErrorStream()));
    String statusOutputLine =""
    while ((statusOutputLine = stdInput.readLine()) != null)
    {
    logger.quiet(" " + statusOutputLine);
    }

    while (( statusOutputLine = stdError.readLine()) != null)
    {
    logger.error(statusOutputLine)
    throw new Exception(statusOutputLine)
    }
    logger.quiet("Successfully Checked out the work space")

我确实在系统上安装了霓虹灯

-bash-4.1$ svn --version svn,版本 1.6.11 (r934486) 编译 2011 年 6 月 25 日,11:30:15

版权所有 (C) 2000-2009 CollabNet。Subversion 是开源软件,请参见http://subversion.tigris.org/ 本产品包括由 CollabNet 开发的软件(http://www.Collab.Net/)。

以下存储库访问 (RA) 模块可用:

  • ra_neon :使用 Neon 通过 WebDAV 协议访问存储库的模块。
    • 处理“http”方案
    • 处理“https”方案
  • ra_svn :用于使用 svn 网络协议访问存储库的模块。
    • 使用 Cyrus SASL 身份验证
    • 处理“svn”方案
  • ra_local :用于访问本地磁盘上的存储库的模块。
    • 处理“文件”方案
4

1 回答 1

0

错误消息似乎很清楚,您传递的 URL 在单引号内。注意它是如何有一个前导和尾随的%22%22是如何"在 URL 中编码的。

问题是您假设您的命令将通过 shell 运行。它不会。所以你的引号变成了传递给命令的文字。相反,任何空格都会被拆分为单独的参数,而不考虑引号。

如果您想控制参数的拆分,您应该生成一个列表而不是单个字符串。

该文档很重要(特别是选项 1 下的 Gotchas 部分): http: //groovy.codehaus.org/Executing+External+Processes+From+Groovy

于 2013-11-04T21:50:09.560 回答