gpt4 book ai didi

maven - 使用 IVY 将 SNAPSHOT Artifact 发布到 Maven - 有什么魔力?

转载 作者:行者123 更新时间:2023-12-04 18:13:24 27 4
gpt4 key购买 nike

我们的情况有点复杂......

在大多数情况下,我们一直在使用 IVY 和 ANT 来管理我们的构建和依赖关系。现在该公司正朝着使用 Maven 的方向发展。我们有一组称为公共(public)库的项目,供几个核心产品使用。

公共(public)库使用 IVY 并发布到 IVY 存储库。我们还需要为我们的新 Maven 项目提供通用库。因此,当构建和发布公共(public)库时,我修改了脚本以发布到 Maven(Artifactory)以及 IVY。以下是发布已构建的 IVY 项目时现在调用的两个目标:

<target name="publish-ivyrepo" depends="load-ivysettings">
<ivy:resolve file="ivy.xml" />
<ivy:publish
module="${ant.project.name}"
artifactspattern="${dist.dir}/[artifact].[ext]"
resolver="integration"
pubrevision="${build.version}"
status="integration"
overwrite="true"
update="true"/>
</target>

<target name="publish-artifactory" depends="load-ivysettings">
<ivy:resolve file="ivy.xml" />
<ivy:publish
module="${ant.project.name}"
artifactspattern="${dist.dir}/[artifact].[ext]"
resolver="artifactory"
pubrevision="${build.version}-SNAPSHOT"
status="integration"
overwrite="true"
update="true"/>
</target>

这是详细说明解析器的 IVY 设置:
<sftp name="integration" checkmodified="true" changingPattern=".*" host="host" user="ivy" userPassword="abc">
<ivy pattern="${ivy.integration.default.root}/${ivy.public.default.ivy.pattern}"/>
<artifact pattern="${ivy.integration.default.root}/${ivy.public.default.artifact.pattern}"/>
</sftp>
<url name="artifactory" checkmodified="false" changingPattern=".*" m2compatible="true">
<ivy pattern="http://server/artifactory/libs-snapshot-local/${maven.default.ivy.pattern}"/>
<artifact pattern="http://server/artifactory/libs-snapshot-local/${maven.default.artifact.pattern}"/>
</url>

我现在在 Artifactory 中看到了常见的库 jar,其中 SNAPSHOT 代替了唯一的时间戳。但是,源 jar 和 IVY xml 文件没有替换 SNAPSHOT。此外,没有生成 POM 文件(尽管我不知道这是否有必要。

所以这似乎没问题,尽管关于 POM 文件的需求以及 IVY xml 和源 jar 的版本命名存在一些问题。但是,当我现在继续指定从 Maven 项目之一到公共(public)库项目的 SNAPSHOT 版本之一的依赖关系时,它提示它无法解决依赖关系:

Missing artifact com.smartstream.common_library:common_library_dao:jar:4.0.0.5-4-SNAPSHOT:compile



我尝试通过 POM 文件和 Maven 设置文件将存储库指定给 Artifactory,但收效甚微:
<repository>
<id>test</id>
<name>simple test</name>
<url>http://server/artifactory/libs-snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>

奇怪的是,如果我让 IVY 发布一个版本而不是 SNAPSHOT 到 Artifactory 的 libs-release-local 存储库中,所有解决方案都如您所愿。此外,如果我将唯一时间戳指定为依赖版本的一部分(SNAPSHOT 的替代品),它也会解决它。所以这表明 Maven 项目能够解决 Artifactory,只是 SNAPSHOT 版本出了点问题。

在这个问题上,我一直在四处寻找,几乎没有希望。如果您能提供任何见解,将不胜感激。

最佳答案

从 ivy 发布到 Nexus 存储库已在此处得到解答:

how to publish 3rdparty artifacts with ivy and nexus

这个答案可能太全面了。相关部分的标题为“ Ivy 解决方案”。我在这里总结一下:

例子

Ivy .xml

您需要一个发布部分来说明您正在发布一个 jar 并且它是关联的 POM:

<ivy-module version='2.0'>
<info organisation="com.myspotonontheweb" module="donaldduck"/>

<publications>
<artifact name="donaldduck" type="jar"/>
<artifact name="donaldduck" type="pom"/>
</publications>

..
..

</ivy-module>

笔记:
  • 另一个例子更复杂,展示了如何将额外的 Artifact 添加到 Maven 模块中。

  • Ivy 设置.xml

    我正在使用 ibiblio解析器,已打开 Maven 2 兼容性。以我的经验,这是在 ivy 中配置 Maven 存储库的最佳方式。
    <ivysettings>
    <settings defaultResolver="nexus-central"/>
    <credentials host="somehost" realm="Sonatype Nexus Repository Manager" username="????" passwd="????"/>
    <resolvers>
    <ibiblio name="nexus-central" root="http://somehost/nexus/content/repositories/central/" m2compatible="true"/>
    <ibiblio name="nexus-deploy" root="http://somehost/nexus/content/repositories/repo" m2compatible="true"/>
    </resolvers>
    </ivysettings>

    笔记:
  • 对于 Artifactory ,凭证领域参数将是“Artifactory 领域”。

  • 构建.xml

    最后是构建逻辑本身。
    <target name="prepare" description="Generate POM">
    <ivy:deliver deliverpattern="${build.dir}/ivy.xml" pubrevision="${publish.revision}" status="release"/>
    <ivy:makepom ivyfile="${build.dir}/ivy.xml" pomfile="${build.dir}/donaldduck.pom"/>
    </target>

    <target name="publish" depends="init,build,prepare" description="Upload to Nexus">
    <ivy:publish resolver="nexus-deploy" pubrevision="${publish.revision}" overwrite="true" publishivy="false" >
    <artifacts pattern="${build.dir}/[artifact](-[classifier]).[ext]"/>
    </ivy:publish>
    </target>

    笔记:
  • 准备目标使用 makepom 生成 POM任务。
  • Ivy deliver task 是可选的,但如果您的 ivy 文件中有任何动态修订(latest.integration、latest.release),建议您执行此任务。
  • 发布 目标发布到设置文件中定义的 nexus-deploy 解析器。
  • ${publish.revision} 属性在构建的其他地方设置。我建议阅读有关 ivy 的 buildnumber任务

  • Artifactory 注意事项

    Artifactory 好像有一些 built-in support for ivy

    关于maven - 使用 IVY 将 SNAPSHOT Artifact 发布到 Maven - 有什么魔力?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8505062/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com