当前,我们有一个项目设置,该项目使用Ivy进行依赖项管理,并使用Ant作为常规构建工具(尽管此处可能无关紧要)。此外,我们还有一堆使用Maven构建的库,并且这些项目(我们有多个)依赖于这些库。我们知道这种情况远非理想,我们正在评估改进方法,但我们无法尽快完成更改。因此,我们必须处理目前的工作。
无论如何,这就是问题所在:它与Maven 2和Ivy一起使用,但是由于一些原因(一个是更好的冲突解决方案),我们最近开始切换到Maven 3,并且这种组合破坏了我们的构建。
首先,我将尝试描述我们的构建如何与Maven 2和Ivy一起使用。之后,我将添加切换到Maven 3时发生故障的地方。
常春藤+ Maven 2
在开发库的新版本时,我们使用的是SNAPSHOT版本,这些版本已安装到本地Maven存储库(.m2)中。此外,我们将这些快照部署到我们的Artifactory中,以便能够共享中间版本以实现一些并行开发。
然后,我们的项目声明对这些快照的依赖性。相应的ivysettings.xml如下所示:
<ivysettings>
<settings defaultResolver="default" />
<include url="${ivy.default.settings.dir}/ivysettings-local.xml" />
<resolvers>
<ibiblio name="public" root="path.to.our.artifactory" m2compatible="true" />
<filesystem name="local-maven2" m2compatible="true" checkmodified="true" changingPattern=".*SNAPSHOT">
<ivy pattern="${user.home}/.m2/repository/[organisation]/[module]/[revision]/[module]-[revision].pom" />
<artifact pattern="${user.home}/.m2/repository/[organisation]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext]" />
</filesystem>
<filesystem name="local" checkmodified="true" changingPattern=".*SNAPSHOT">
<ivy pattern="${ivy.local.default.root}/${ivy.local.default.ivy.pattern}" />
<artifact pattern="${ivy.local.default.root}/${ivy.local.default.artifact.pattern}" />
</filesystem>
<filesystem name="local2" checkmodified="true" changingPattern=".*SNAPSHOT">
<ivy pattern="${user.home}/.ivy2/cache/[organisation]/[module]/ivy-[revision].xml" />
<artifact pattern="${user.home}/.ivy2/cache/[organisation]/[module]/[artifact]-[revision].[ext]" />
</filesystem>
<chain name="default" checkmodified="true" changingPattern=".*SNAPSHOT">
<resolver ref="local" />
<resolver ref="local-maven2" />
<resolver ref="public" />
</chain>
</resolvers>
<include url="${ivy.default.settings.dir}/ivysettings-shared.xml" />
</ivysettings>
由于这种设置,Ivy应该寻找快照的较新版本并正确解决该问题。通过比较相应.pom文件的文件日期来标识较新的版本。
当我们使用Maven 2构建快照时,相应的.pom将获得当前构建的文件日期,因此该检查有效,Ivy会解析正确的快照版本。
常春藤+ Maven 3
当使用Maven 3构建快照时,上述分辨率会中断。其原因似乎是,已安装的.pom文件未获得当前时间戳记作为其文件日期,但保留了复制的原始pom.xml的文件日期。因此,Ivy无法检测快照是否是新的。
似乎Maven 3将更新时间戳存储在maven-metadata-local.xml中,但是Ivy不会读取。我们知道有一个ibiblio解析器(我们正在使用),但是根据我们所知道的(例如,从类似这样的问题),它的意思是使用真正的删除存储库,并且在应用于本地.m2存储库时可能会产生问题。
我们还考虑过跟踪其他文件的文件日期,例如maven-metadata-local.xml或实际的工件,但是我们不确定这是否明智或在其他情况下会破坏构建。
那么我们应该/如何解决呢?
TL; DR
处理Mvy 3生成并部署在本地.m2存储库中的快照的Ivy依赖项的标准/建议方式是什么?
更新2016-07-26
这是我尝试解决此问题的两件事,但是我不确定是否会有我没有想到的副作用。如果有人可以对此有所解释,我将不胜感激:
useOrigin="true"
(可能还有一个较低的defaultTTL)的缓存配合使用。这样,似乎只有xml文件存储在.ivy2高速缓存中,并且在.m2存储库中引用了工件,即未复制它们。root="file://${user.home}/.m2/repository/"
该解析器似乎能够解析大多数工件(例外情况请参见下文),但在读取元数据时似乎仍然失败,即它不会使用.m2中提供的较新版本来更新缓存。回购。file://{user.home}/.m2/repository/javax/enterprise/cdi-api/1.0/cdi-api-1.0.jar
工件存在时一样,即我直接从Windows资源管理器复制了路径,它是"${user.home}\.m2\repository\javax\enterprise\cdi-api\1.0\cdi-api-1.0.jar"
。...我们知道这种情况远非理想,我们正在评估改善方法,但我们可以...
根据我的经验,这是完全正常的。许多大型公司都有许多由ANT,Maven和越来越多的Gradle混合而成的项目。
以下是我会提出的一些建议
集成这些不同技术的最佳方法是运行一个中间存储库来保存所有构建输出。这将有效地将构建步骤与以后如何使用二进制伪像分离。
推荐的存储库技术是Maven存储库(此时为Java标准),您可以选择开放源代码技术来托管您的存储库:
当运行一台额外的服务器似乎是一项开销时,随着相关项目数量的增加(拥有一个大型共享文件系统无法扩展),它会花掉很多钱。
无论如何,无论如何,您都需要具有发行二进制文件的参考副本。这些Maven存储库管理器使您可以控制项目从中使用的第三方依赖关系,并有帮助地缓存文件,这实际上会减少构建时间并简化共享依赖关系管理。
最后,如何配置使用Maven存储库的Ivy构建?如下所示,使用ibiblio解析器(您会发现所有现代Java构建工具都对本地Maven存储库具有类似的支持)
<ivysettings>
<settings defaultResolver="myrepo"/>
<resolvers>
<ibiblio name="myrepo" m2compatible="true" root="http://myrepo.com/path/to/repo"/>
</resolvers>
</ivysettings>
Snaphot版本是Maven引入的一个概念,它是一个自以为是的构建框架。我认为使用它们时应该非常谨慎:
正如您所发现的那样,快照在不断变化,与与希望保持不变的测试效果的小组共享时(例如QA),不能依赖快照。
我的想法是由以下讨论Maven发布管理方法的帖子所影响的:
最后,虽然我建议将快照的使用限制为紧密协作的团队,但ivy确实支持它们,但是快照的使用存在一些众所周知的限制。由于它们是Maven构造,因此不受其他构建技术的100%支持。这是存储库管理器真正提供帮助的地方,因为它们能够重新生成正确的元数据以支持快照版本:
希望这可以帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句