当前位置: 首页 > 知识库问答 >
问题:

通过示例发布到本地Ivy缓存并从其中解析

党建义
2023-03-14

我认为这里最令人惊讶的是,此功能默认为Maven和Gradle,但是,在Ant / Ivy景观中没有它存在的痕迹(亲眼看看!

我继承了一套JVM组件,这些组件使用Ant / Ivy作为其构建/依赖系统。每个组件之间都有很多依赖关系,这意味着对其中一个组件进行更改通常会产生连锁反应,要求您更新Ivy依赖项并发布上游依赖项的新版本。

维护这些项目的旧团队通过将快照罐发布到快照存储库来处理本地开发。我想用一个新范例替换这个范例,即快照发布到本地常春藤缓存/从本地常春藤缓存解析。

我能够找到这个非常相似的问题,但发现答案在细节上有点欠缺(特别是一个完全缝合在一起的代码片段),部分原因是这个问题缺少任何特定的代码示例。因此,我在这里创建了一个SSCCE,并推送了2个GitHub回购:

  • 嘶嘶声模型,定义数据模型(一些无意义的POJO)的Java库
  • 嘶嘶声应用程序,一个简单的可执行罐子,依赖于嘶嘶声模型作为依赖关系

我在这里寻找的是确切的(即实际代码,而不是伪代码)更改(可能是build.xmlivy.xmlivy-settings.xml,或所有三个!),这将允许我使用以下本地开发/测试周期:

  1. 我对 fizzbuz 模型进行了更改,并将更改本地发布到 Ivy 缓存,最好是作为快照版本(如 1.0.0-SNAPSHOT 或类似版本)
  2. fizzbuzz-app 根目录内部,我运行 ant 解析,从缓存的快照中提取这些更改
  3. 现在我可以在嘶嘶声应用程序中利用这些更改

虽然这不是一个硬性要求,但我希望不必手动管理版本号。也就是说,当我在本地发布< code>fizzbuzz-model时,它会用相同的版本覆盖当前的二进制文件(同样,就像< code > fizz buz-model-1 . 0 . 0-snapshot . jar ),而不是将buildnumber增加到例如< code > fizz buzz-model-1 . 0 . 1-snapshot . jar 或类似的版本)。这样,在本地测试时,我只需发布< code>fizzbuzz-model并解析< code>fizzbuzz-app。

目前,当我发布< code>fizzbuzz-model时,我得到以下错误:

/Users/myuser/workspace/fizzbuzz-model/build.xml:52: impossible to publish artifacts for hotmeatballsoup#fizzbuzz-model;1.0: java.io.IOException: missing artifact hotmeatballsoup#fizzbuzz-model;1.0.0-SNAPSHOT!fizzbuzz-model.pom
    at org.apache.ivy.core.publish.PublishEngine.publish(PublishEngine.java:225)
    at org.apache.ivy.core.publish.PublishEngine.publish(PublishEngine.java:172)

要在本地复制,请克隆这两个项目并遵循它们的README,从fizzbuzzmodel开始。有人能看出我哪里出错了吗?欢迎在这里回答和/或提交PR,无论您喜欢哪一个!谢谢!

共有1个答案

鲁望
2023-03-14

该错误表明ivy在本地构建工作区中找不到要发布的文件。这不是快照问题。

问题在于:

<ivy:publish resolver="local" pubrevision="1.0.0-SNAPSHOT" >
  <artifacts pattern="dist/[artifact]-[revision].[ext]" />
</ivy:publish>

您在模式中包含了一个“修订版”,但不幸的是,您在本地创建的jar与此命名约定不匹配。它缺少两个修订版,并且有一个错字(应该是“fizzbuzz”,而不是“fizbuz”):

<target name="dist" depends="clean,compile">
  <jar jarfile="dist/fizzbuz-model.jar" basedir="build/main" />
</target>

我预测会有进一步的问题,因为您正试图配置ivy来模拟Maven存储快照修订的方式。这需要额外的元数据文件,Maven从未正式记录过这些文件。我强烈建议将您发布的文件推送到Maven存储库管理器,以获得正确格式化的快照存储。

以下是将文物发布到常春藤的 Maven 回购的示例

    < li >使用IVY将快照工件发布到Maven有什么神奇之处? < Li > https://support . sonatype . com/HC/en-us/articles/213465388-How-do-I-configure-my-Ivy-build-to-deploy-artifacts-to-Nexus-

我已按要求提交了Pull请求,并就如何优先使用本地常春藤存储库而不是快照版本提出了建议:

  • fizzbuzz-model-(拉取请求)
  • fizzbuzz-app-(拉取请求)

总之,该模型会发布每个新版本,每次生成

<target name="publish" depends="clean,dist">

    <!-- Determine build number from previously published revisions -->
    <ivy:buildnumber resolver="local" organisation="${ivy.organisation}" module="${ivy.module}" revision="${target.release}"/>

    <!-- Resolve ivy dependencies and create a Maven POM file -->
    <ivy:deliver deliverpattern="dist/ivy.xml" pubrevision="${ivy.new.revision}" status="release"/>
    <ivy:makepom ivyfile="dist/ivy.xml" pomfile="dist/fizzbuzz-model.pom" />

    <!-- Publish the local repo. Defaults to ~/.ivy2/local -->
    <ivy:publish resolver="local" pubrevision="${ivy.new.revision}" >
        <artifacts pattern="dist/[artifact].[ext]" />
    </ivy:publish>
</target>

这在应用程序代码中用作动态依赖项,始终检索其他模块的最新发布版本。

<dependencies>
    <dependency org="hotmeatballsoup" name="fizzbuzz-model" rev="latest.integration" conf="compile->default" />
</dependencies>

笔记:

  • 另外,还生成了POM文件,严格来说,除非您将工件推送到Maven repo,否则没有必要生成POM文件

像ivy这样的依赖管理器来自Maven普及之前的时代(我记得Maven 1.0被普遍憎恨的时候),所以ivy没有完全实现Maven的工作流程也就不足为奇了。

Maven一直是一个高度固执己见的工具。令人困惑的是,它支持两种发布工件的方法。作为版本或快照。在我看来,这是在尝试使用 Maven 进行持续部署时引起最大摩擦的原因,其中应考虑发布所有版本。但不可否认的是,Maven 是分发所有基于 Java 的二进制文件的通用方法。Maven 存储库可以作为支持多种构建技术(Maven、Gradle 或 ANT/Ivy)的单一集成点。

因此,首先需要接受的是,快照开发工作流是Maven所特有的,而且据我所知,其他任何存储库格式都没有复制它。

在其他存储库中,发布的版本号始终是唯一的。这适用于官方版本、候选版本或开发版本。另一方面,Maven 快照永远不会最终确定。我这么说是什么意思?如果我今天针对版本“1.0-SNAPSHOT”进行构建,那么明天的依赖关系可能会完全不同。这是因为每个新的快照生成都会在后台创建一个新的带时间戳的工件,以覆盖以前存储的二进制文件。

Ivy有不同的机制来支持开发版本(不同并不意味着更好)。可以依赖于开发中的最新版本,但这将始终在构建时显式解决。当一个人将一个工件发布到常春藤存储库时,方便的交付任务能够创建一个完全解析的常春藤文件。对于使用哪个版本的依赖项,永远不会有任何歧义。

总之,首先要确定您是否真的需要支持快照工作流。除非您打算使用Maven与其他团队集成,否则强迫ivy遵循它并不支持的工作流是不明智的。

 类似资料:
  • 假设我们网站有一个使用多个查询生成的简介页面。我们有此页的模型,如 UserProfile 类,它包含用户所有简介数据,及一个获取指定用户 id 简介的 GetProfile 方法。 public class UserProfile { public string Name { get; set; } public List<CachedFriend> Friends { get;

  • 9.7. 示例: 并发的非阻塞缓存 本节中我们会做一个无阻塞的缓存,这种工具可以帮助我们来解决现实世界中并发程序出现但没有现成的库可以解决的问题。这个问题叫作缓存(memoizing)函数(译注:Memoization的定义: memoization 一词是Donald Michie 根据拉丁语memorandum杜撰的一个词。相应的动词、过去分词、ing形式有memoiz、memoized、me

  • Serenity 提供一些缓存抽象和实用功能让你更容易地使用本地缓存。 术语 本地(local) 的意思是指在本地内存中缓存项目(因此没有涉及到序列化)。 当你的应用程序在网站群(web farm) 中部署时,本地缓存可能还不够或者有时合适。我们将在 分布式缓存 章节中讨论该场景。

  • 我已经将Hazelcast缓存配置为Spring Boot应用程序中的分布式缓存。 我想要为同一实例提供本地缓存,其中很少缓存不应共享。 如何在应用中一起做本地和分布式缓存?

  • 我是新手,我正在尝试找出如何示例应用程序到我的本地存储库。我可以发布spray项目,但不能发布示例应用程序。通过在

  • 我们可以通过下面的简单算法实现该目的: 检查本地缓存的键(key); 如果本地缓存存在该键,则返回它的值; 如果本地缓存不存在该键,则尝试在分布式缓存中找; 如果分布式缓存存在该键,则返回它的值并把它添加到本地缓存; 如果分布式缓存不存在该键,则从数据库中获取,并添加到本地和分布式缓存,最后返回该值。 当在本地缓存服务器中缓存一些信息时,使用这种方式,它还将信息缓存到分布式缓存,但这一次,如果其他