Apache Commons Exec执行含正则表达式的Git命令时参数异常问题
Apache Commons Exec执行带正则的Git命令失效问题及解决办法
问题描述
使用Apache Commons Exec执行包含正则表达式的Git命令时,Git返回空结果且退出码为1,但手动执行该命令可正常获取结果。将正则表达式参数替换为普通字符串时,Exec执行恢复正常,推测是Apache Commons对正则参数的处理逻辑导致其失效。
构建完成后CommandLine的打印结果:
[git, --no-pager, grep, --line-number, --untracked, --extended-regexp, "^\s*public void\s+(testFindByAdAccount).*", --, *Test.java]
复现步骤
- 克隆示例仓库
- 执行命令
gradlew shadowJar生成项目jar文件 - 运行命令
java -jar app/build/libs/app-all.jar - 输出显示命令执行失败,退出码为1,报错信息如下:
HELLOOOOOO WD::: null [git, --no-pager, grep, --line-number, --untracked, --extended-regexp, "^\s*public void\s+(testAppHasAGreeting)\(\).*", --, *Test.java] WD::: /Users/rgurney/Src/personal/min-example Exception in thread "main" java.lang.RuntimeException: org.apache.commons.exec.ExecuteException: Process exited with an error: 1 (Exit value: 1) at min.example.App.lambda$runCommand$1(App.java:74) at io.vavr.control.Try.getOrElseThrow(Try.java:748)
- 手动执行相同命令可得到预期结果:
git --no-pager grep --line-number --untracked --extended-regexp "^\s*public void\s+(testAppHasAGreeting)\(\).*" -- "*Test.java"
返回内容:
app/src/test/java/min/example/AppTest.java:11: public void testAppHasAGreeting() {
原因分析
问题核心在于参数的引号处理逻辑差异:
- 手动执行命令时,Shell会解析并移除引号,将正则表达式作为单个完整参数传递给Git;但Apache Commons Exec会将带引号的字符串直接作为参数的一部分传递,导致Git接收到的正则表达式包含多余的双引号,无法匹配目标内容。
- 通配符
*Test.java的传递逻辑同理,但Git本身支持解析该通配符,因此不是主要问题。
解决方案
构建CommandLine时,不要给正则表达式和通配符参数添加引号,直接传递原始字符串:
- 移除正则表达式参数的双引号,将带引号的正则字符串改为原始正则表达式
- 通配符参数
*Test.java直接传递,无需添加引号
修改后的CommandLine结构应为:
[git, --no-pager, grep, --line-number, --untracked, --extended-regexp, ^\s*public void\s+(testAppHasAGreeting)\(\).*, --, *Test.java]
代码调整示例
在Java代码中构建CommandLine时,传入未加引号且正确转义的参数:
CommandLine cmdLine = new CommandLine("git"); cmdLine.addArguments(new String[]{ "--no-pager", "grep", "--line-number", "--untracked", "--extended-regexp", "^\\s*public void\\s+(testAppHasAGreeting)\\(\\).*", // Java中需转义反斜杠 "--", "*Test.java" });
调整后,Apache Commons Exec会将每个参数正确传递给Git,Git能解析到正确的正则表达式,从而返回预期匹配结果。
内容的提问来源于stack exchange,提问作者ragurney
相关产品推荐
相关产品推荐

