Apache Ivy和本地Maven存储库-如何处理使用Maven 3构建的快照

汤玛士

当前,我们有一个项目设置,该项目使用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

这是我尝试解决此问题的两件事,但是我不确定是否会有我没有想到的副作用。如果有人可以对此有所解释,我将不胜感激:

  1. 将文件系统解析器用于本地.m2存储库,但要与具有useOrigin="true"(可能还有一个较低的defaultTTL)的缓存配合使用这样,似乎只有xml文件存储在.ivy2高速缓存中,并且在.m2存储库中引用了工件,即未复制它们。

    这似乎可行,但是我不确定是否可以通过第一次查找从共享快照存储库(Artifactory)中下载快照,然后稍后再由本地版本更新快照。在这种情况下,我们可能最终将工件的远程版本缓存在.ivy2中,并将一个较新版本安装到.m2中,.pom文件日期在两种情况下都相同。
  2. 使用ibiblio解析器,root="file://${user.home}/.m2/repository/"解析器似乎能够解析大多数工件(例外情况请参见下文),但在读取元数据时似乎仍然失败,即它不会使用.m2中提供的较新版本来更新缓存。回购。

    虽然能够解析.m2存储库中的大多数工件,但似乎会出现一些“ URL”的解析错误,就像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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Maven:如何清除本地存储库中的旧快照?

Apache Ivy:本地Ivy缓存和本地存储库之间的区别

使用Gradle(Android Studio)和本地Maven存储库时无法构建应用

Maven 3不会从本地存储库更新快照依赖关系

如何处理Jenkins上的并发Maven构建?

在构建 Maven 时使用多个本地存储库

如何使用Docker和Pipelines缓存本地Maven存储库?

带有发布和快照标签的Maven远程存储库

由于CHECKSUM FAILED如何处理我的Maven构建中丢失的远程资源

使用Apache Spark时如何处理数据库的背压?

如何阻止Maven将项目构建JAR安装到本地存储库

在 Gradle 构建中定义 Maven 存储库后,如何将其替换为本地目录?

如何在docker maven中将jar构建到我的本地存储库

使用jenkins的Maven构建未从本地.m2存储库中提取jar

SBT PublishM2不刷新本地Maven存储库中的快照jar

如何将第 3 方本地 Maven 存储库添加到 android 项目

在Maven中构建/部署第三方项目,但上传到我的快照存储库

Maven 3会忽略已定义的远程存储库,并且无法下载快照工件

如何为Maven设置Archiva内部+快照存储库?

在构建之前将jar添加到Maven本地存储库

Maven如何处理多个<repository>配置?

Maven:如何处理包含模块的模块?

如何备份/还原Maven本地存储库

关于本地和远程快照的 Maven 更新策略快照

使用Maven本地存储库的Gradle配置

Maven不使用本地存储库

如何使用S3作为Maven存储库?

是否有 Apache Spark Release Candidates 的 Maven 存储库?

无法在本地存储库中缓存https://repo.maven.apache.org/maven2中找不到javax.sql:jdbc-stdext:jar:2.0的信息,