正在为我的自定义svn Gradle插件获取svn:E170000:无法识别的URL方案

正在为我的自定义svn Gradle插件获取svn:E170000:无法识别的URL方案,svn,groovy,gradle,Svn,Groovy,Gradle,我使用groovy编写了一个定制的gradle插件来执行基本的svn任务,如签出、清理、标记等。groovy类调用svn命令行客户端来执行这些操作,当我在windows系统上运行它时,它可以正常工作,但当我在linux系统(Centos)上运行它时,同一个插件会出现以下错误 svn:E170000:无法识别的URL方案 '%22https://source.mycompany.net/svn/MyProject/trunk%22" 我能够通过命令提示符或shell脚本对命令行客户端进行相同的调用

我使用groovy编写了一个定制的gradle插件来执行基本的svn任务,如签出、清理、标记等。groovy类调用svn命令行客户端来执行这些操作,当我在windows系统上运行它时,它可以正常工作,但当我在linux系统(Centos)上运行它时,同一个插件会出现以下错误

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

我能够通过命令提示符或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")
我确实在系统上安装了neon

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

版权所有(C)2000-2009 CollabNet。 Subversion是开源软件,请参阅 此产品包括由CollabNet()开发的软件

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

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

错误消息似乎非常清楚,您传递的URL位于单引号内。请注意它的前导和尾随
%22
%22
是URL中
的编码方式

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

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

本文件的要点(尤其是选项1下的Gotchas部分):