我想一次清理我所有的 Maven 项目。但我想避免逐步手动浏览所有文件夹并调用mvn clean
. 所以我想用 find 命令来做这件事。我尝试了以下调用:
find . -name pom.xml -exec mvn clean {} \;
结果是错误消息:find: missing argument for "-exec"。
现在我的问题是:是否可以使用find和exec进行这样的调用?我以为我可以将每个命令用作find -exec的参数。
提前感
谢哈迪
如果您扩展 exec 将为您运行的内容:
mvn clean dir1/dir2/pom.xml
您会看到您将 pom 文件视为 maven 目标。
您应该使用 -f 标志和撇号(以防止通配符):
find . -name pom.xml -exec mvn clean -f '{}' \;
至于我,我使用这个命令
find . -name 'target' -a -type d -exec rm -rfv '{}' \;
这将删除所有目标文件夹。
我不确定哪个版本的 mvn 命令支持这样指定 pom 文件,但是对于例如 Maven 3.x 来说,它不起作用。我们需要一点点改变。使用-execdir运行,它会自动将目录更改为找到的 pom 文件的位置(通常比 -exec 更安全):
find . -name pom.xml -execdir mvn clean \;
或使用指定的备用 pom 文件选项-f:
find . -name pom.xml -exec mvn clean -f '{}' \;
如果您像我一样检查了很多 maven 项目,那么建议的方法可能需要几个小时。我目前有 700 个项目已签出。
find . -maxdepth 3 -type f -name pom.xml |
sed 's|/pom.xml$|/target|' |
xargs -I{} bash -c '[ -d {} ] && echo {}' |
xargs -I{} bash -c 'mvn clean -f "$(sed "s|/target$|/pom.xml|" <<< "{}")"'
我在这里所做的是在应用 clean 命令之前测试目标文件夹是否存在。
这样一来,除非有理由,否则我不会激活 maven,然后执行时间与我最近参与的项目成线性关系,而不是项目总数。
您可能还需要调整一下 maxdepth,以防我的号码不符合您的要求。