我在项目中使用maven和git。 git存储库包含一个maven项目,该项目包含多个子项目,这些子项目位于具有自己的pom文件的不同目录中。我使用git本地分支,我经常在这些分支之间切换。每当我切换git本地分支时,我都需要调用mvn install
来刷新$HOME/.m2
中的本地maven存储库缓存。 git分支交换机很快,但本地本地maven缓存重建需要20多分钟。如果我不重建它,则子项目构建失败,因为子项目依赖于其他子项目。
我的目的是为合并后创建一个git钩子,并为每个分支创建一个单独的maven存储库缓存。然后git钩子可以调用类似ln -s branch-specific-cache $HOME/.m2
的东西。
但我认为这样的解决方案必须已经存在,而且我不想发明轮子。是否存在允许跟随的现有机制?
答案 0 :(得分:2)
我将此作为单独的答案添加,因为我认为它确实是最干净,最简单的解决方案,而且没有"技巧"使用多个本地maven存储库。
简而言之 - 您需要在每个分支中使用不同的工件版本控制。一个简单的约定可能是:BRANCH-X.Y.Z[-SNAPSHOT]
。
例如:
develop
分支:<version>0.0.1-SNAPSHOT</version>
abc
分支:<version>ABC-0.0.1-SNAPSHOT</version>
xyz
分支:<version>XYZ-0.0.1-SNAPSHOT</version>
Maven非常有能力使用这样的版本操作,你可以在同一个repo中做到这一点,而不会让分支工件踩在彼此之上。脚趾。
请注意,我已在本地对此进行了测试,我的项目版本为1.16-SNAPSHOT
,而SQLSERVER-1.16-SNAPSHOT
位于sqlserver
分支,它就像魅力一样。
答案 1 :(得分:1)
这真的很讨厌,但你可以尝试这样的事情(没有经过测试)。
conf/settings.xml
文件<localRepository>
设置为在 git项目通过这种方式,每次更改分支时,您都会更改settings.xml
,并且当您运行mvn ...
请注意,我没有对它进行测试,而且它非常“hacky”,但它应该会给你一些想法。
答案 2 :(得分:1)
经过一些实验后,我创建了一个git post-checkout
钩子。我在我家$HOME/.m2.branch-name/subproject
的每个分支都有一个目录。根据我在git repository中看到的分支,maven缓存包含指向目录的符号链接。
如果新选择的分支的目录已存在,则post-checkout
挂钩会创建符号链接,或者创建目录并从先前选定的分支复制数据。第一种情况很快。由于复制,第二种情况需要很长时间,但只有在创建和检出新分支时才会执行一次。
钩子脚本是:
#!/bin/sh
project=$HOME/.m2/repository/com/mycompany
subproject=mysubproject
newbranch=`git rev-parse --abbrev-ref HEAD`
m2newbranch=~/.m2.$newbranch
if [ -d "$m2newbranch" ]
then
ln -sf "$m2newbranch/$subproject" "$project"
else
mkdir -p "$m2newbranch/$subproject"
cp -R "$project/$subproject/"* "$m2newbranch/$subproject"
ln -sf "$m2newbranch/$subproject" "$project"
fi