You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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时,不要给正则表达式和通配符参数添加引号,直接传递原始字符串:

  1. 移除正则表达式参数的双引号,将带引号的正则字符串改为原始正则表达式
  2. 通配符参数*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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 13:20:20