sfbizcore依赖了nfcore-facade包,但是sfbizcore中的一个方法在nfcore-facade本地包中没有找到,导致编译失败。本地删除依赖的nfcore-facade后重新拉取依旧有问题。查看mvn-test环境的nfcore-facade包,发现是包是完整的,mvn-dev环境包是有问题的,所以问题在于为什么maven优先拉取了mvn-dev环境包。
2解决过程1、删除本地nfcore-facade后重新拉取依赖。发现新拉取的包依旧还是原来的包。
2、查看生产环境(mvn-test)的maven仓库,下载源码包发现代码是完整的;查看开发环境(mvn-dev)的maven仓库,下载源码包发现代码是不完整的。所以本地maven拉取的是dev的包,而没有拉到test的包。
3、根据pom中的mvn配置的仓库来看,正常应该是先拉取的test环境的包,找不到的情况再拉取dev环境的包,说明maven没有使用pom文件中配置的仓库地址。
dev true dev aistarfish-release http://mvn-test.aistarfish.net/nexus/content/groups/aistarfish-release/ aistarfish-dev http://mvn-dev.aistarfish.net/nexus/content/groups/aistarfish-dev/
4、查看idea本地的maven配置,使用的是自己配置的maven和settings文件
查看本地settings文件的配置,其他配置没有问题,基本上都被注释掉了,只有mirrors这个标签需要注意一下。
aistarfish-test central aistarfish-test http://mvn-test.aistarfish.net/nexus/content/groups/aistarfish-release/ aistarfish-dev * aistarfish-dev http://mvn-dev.aistarfish.net/nexus/content/groups/aistarfish-dev
5、尝试修改该mirror的配置:aistarfish-test的mirrorOf标签从central改为*
aistarfish-test * aistarfish-test http://mvn-test.aistarfish.net/nexus/content/groups/aistarfish-release/ aistarfish-dev * aistarfish-dev http://mvn-dev.aistarfish.net/nexus/content/groups/aistarfish-dev
6、重新拉取包之后发现包是完整的了,问题解决。
原因1、idea设置了自定义的maven配置和settings文件
2、settings文件中aistarfish-test的mirrorOf使用了默认值central
3、maven仓库的dev包和test包不一致,dev仓库的包不是最新的
maven获取真正起作用的repository集合流程:首先会获取pom.xml里的repository集合,然后在settings.xml里找mirrors元素,如果repository的id和mirror的mirrorOf的值相同,则该mirror替代该repository,如果该repository找不到对应的mirror,则使用其本身,依此可以得到最终起作用的repository集合,repositories中默认包含了中央仓库central,当然也可以重新它的url;可以理解mirror是复写了对应id的repository。
在这个问题中,因为pom文件中id为"aistarfish-release"的仓库在settings文件中匹配到了“aistarfish-dev”的mirrorOf值(aistarfish-dev使用的是*,而aistarfish-test使用的是central),所以最后使用了dev环境的maven仓库,当把aistarfish-test的mirrorOf修改为*之后,能够被"aistarfish-release"匹配到所以生效了。(如果多个配置都能匹配成功,则优先匹配第一个)
所以当我把settings文件中的“aistarfish-dev”的mirrofOf也改成central,这时候pom中的"aistarfish-release"仓库既没有匹配到aistarfish-test,也没有匹配到aistarfish-dev,所以最后使用自己的仓库地址,也可以拉到正确的包。
- 没有配置mirrors的情况
- 配置了mirrors的情况
可以从以下几方面规避这个问题
1、使用idea自带的maven插件和settings文件
2、如果使用了自定义的setting文件,mirrors标签不要进行配置
3、如果使用了自定义的setting文件,mirrors标签使用的镜像mirrorOf要与pom文件中的仓库地址匹配,可以直接配成*



