正在为我的自定义svn Gradle插件获取svn:E170000:无法识别的URL方案
我使用groovy编写了一个定制的gradle插件来执行基本的svn任务,如签出、清理、标记等。groovy类调用svn命令行客户端来执行这些操作,当我在windows系统上运行它时,它可以正常工作,但当我在linux系统(Centos)上运行它时,同一个插件会出现以下错误 svn:E170000:无法识别的URL方案 '%22https://source.mycompany.net/svn/MyProject/trunk%22" 我能够通过命令提示符或shell脚本对命令行客户端进行相同的调用,而不会出现任何问题。那么,它们之间的区别是什么呢 以下是我的代码示例:正在为我的自定义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脚本对命令行客户端进行相同的调用
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:用于访问本地磁盘上存储库的模块。
- 处理“文件”方案
%22
%22
是URL中“
的编码方式
问题是,您假设您的命令将通过shell运行。它不会。因此,您的引号将成为传递给该命令的文本。相反,任何空格将被拆分为单独的参数,而不考虑引号
如果要控制参数的拆分,应该生成一个列表,而不是单个字符串
本文件的要点(尤其是选项1下的Gotchas部分):