ivy:publish 是如何工作的?

Posted

技术标签:

【中文标题】ivy:publish 是如何工作的?【英文标题】:How does ivy:publish work? 【发布时间】:2008-12-09 16:18:24 【问题描述】:

我完全不知道蚂蚁任务 ivy:publish 应该如何工作。

我希望我进行正常的构建,这会创建一堆 jar 文件,然后我会将这些 jar 推送到(本地)存储库。

我如何指定从哪里检索构建的 jar,以及这些 jar 将如何在存储库中结束?

更新:

<target name="publish-local" description="--> Publish Local">
    <ivy:retrieve />
    <ivy:publish resolver="local" pubrevision="$release.version" status="release" update="true" overwrite="true">
        <artifacts pattern="$dist.dir/[organisation]-[module].[ext]" />
    </ivy:publish>
</target>

这确实有效,我之前没有包含检索。

但是我还是有一些问题,假设我要发布 3 个 jar,openscada-utils.jar,openscada-utils-sources.jar 和 openscada-utils-javadocs.jar 作为 openscada-utils-0.9.2.jar, openscada-utils-0.9.2-sources.jar 和 openscada-utils-0.9.2-javadocs.jar

我并不完全清楚实际名称是如何组合的,以及我可以在哪里指定它们应该获取哪些名称。 (使用上面的片段,jar 总是只调用 utils.jar)。

更新 1:

我让它工作了(有点),但它仍然感觉不对。不知何故,所有教程都关注来自 3rd 方项目的依赖项,但对我来说同样重要的一点是处理项目特定的依赖项。

我有一堆以各种方式相互依赖的子项目。考虑到 ivy:publish 我不清楚如何开始。

    如何处理第一个版本?我对所有子项目都有一个共同的版本号,以表明它们属于一起(比如说 0.9)。因此,第一个修订版应该是 0.9.0,但到目前为止,我的存储库中没有任何项目。如何让 Ivy 分配此修订号。

    在开发过程中我想再次发布构建的文件,目前不更改修订号。

    如果我完成了我的工作,我想将它推送到一个共享存储库(并将修订号从 0.9.0 增加到 0.9.1),推荐的方法是什么?

    1234563我怎样才能利用它来发挥我的优势?

【问题讨论】:

仅供参考,根据this deliver 任务由publish 任务调用。 【参考方案1】:

您需要指定“解析器”。比如:

<ivy:publish resolver="local" pubrevision="1.0"/>

它由模式控制。这个page 很好地涵盖了它。看起来您希望自己是:

<artifacts pattern="$dist.dir/[organisation]-[module]-[revision]-[type].[ext]" />

您需要将这三个 jar 标识为 ivy.xml 文件中的工件。像这样的:

<publications>
    <artifact name="utils"/>
    <artifact name="utils" type="source"/>
    <artifact name="utils" type="javadocs"/>
</publications>

【讨论】:

【参考方案2】:

首先你需要一个 ivy.xml 文件。

<ivy-module version="2.0">
    <info organisation="com.example.code" module="MyProject"
         revision="$project.revision"/>
    <configurations>
        <conf name="runtime" description="" />
        ... other config elements here...
    </configurations>

    <publications defaultconf="runtime">
        <artifact name="MyProject" type="jar" ext="jar" conf="runtime" />
    </publications>

    <dependencies>
        ...
    </dependencies>
</ivy-module>

ivy.xml 中的 info 元素和 Publications 元素允许您 跳过 build.xml 中 ivy 元素的各种属性。

注意 ivy.xml 中的 $project.revision。该属性被赋予了价值 在 build.xml 中,但这似乎工作得很好。然后可以修改 轻松获得所需的任何值(例如,夜间构建与本地构建)。

这是一个如何设置 build.xml 文件的示例

<property name="project.revision" value="1.0.0"/>

...

<target name="ivy">
    <ivy:resolve />

    <!-- Possible ivy:report, ivy:retrieve and other
    elements for managing your dependencies go here -->

    <ivy:deliver conf="*(public)"/> 
</target>

<target name="publish" depends="clean, ivy, jar">
    <ivy:publish resolver="local">
        <!-- possible artifacts elements if your artifacts
        are not in standard location -->
    </ivy:publish>
</target>

...

【讨论】:

很好的参考draconianoverlord.com/2010/07/18/…【参考方案3】:

您应该先运行&lt;ivy:deliver/&gt; 任务。这将创建一个 ivy.xml 文件,可供 Ivy 存储库使用。

当您使用&lt;ivy:publish&gt; 时,您可以通过在resolver 参数中指定要发布到哪个存储库。这需要与您的 ivy.settings.xml 文件中的解析器名称相匹配。

您并没有真正指定工件,而是指定在哪里找到要发布的工件的模式。您可以通过&lt;ivy:publish&gt; 任务上的&lt;artifacts&gt; 子任务来指定它。例如,如果您像我们一样在$basedir/target/archive 目录下构建所有内容,您可以将其指定为:

<ivy:publish resolver="public">
   <artifacts path="target/archive/[artifact].[ext]"/>
</ivy:publish>

如果要更改文件的修订号,可以使用&lt;ivy:publish&gt; 任务的pubrevision 参数。这不会更新 ivy.xml,但会将您的 jars/wars 发布到正确的修订版。我更喜欢使用&lt;ivy:deliver&gt; 任务的pubrevision 参数,让它创建正确的ivy.xml 文件。然后,&lt;ivy:publish&gt; 将使用我的ivy.xml 文件中的修订。

你不需要做&lt;ivy:retrieve&gt;。毕竟,您正在运行构建以创建新的 jar,它们应该在您的构建中的某个位置。否则,如果您不创建 jar 或 war,您想将什么发布到您的 Ivy 存储库中?而且,您当然不想为了重新发布而检索 Ivy 存储库中已有的内容。


我的理念一直是发布是一项 CM 任务,不应作为构建过程的一部分来完成。因此,我们不使用&lt;ivy:deliver&gt;&lt;ivy:publish&gt;

我们使用 Artifactory 作为我们的 Ivy 存储库(和我们的 Maven 存储库)。我们使用Jenkins 作为我们的持续构建服务器。

我要做的是让开发人员通过&lt;ivy:makepom&gt; 任务从他们的ivy.xml 文件中创建一个pom.xml 文件。这和构建 jars/wars 在 Jenkins 中保存为存档工件。

当我们对特定构建感到满意并希望它在我们的公共存储库中时,我使用 Jenkins 的提升构建任务将带有 pom.xml 的特定 jar/war 提升到我们的 Artifactory 存储库。我们使用mvn deploy:deploy-file 任务来做到这一点。

【讨论】:

【参考方案4】:

了解 ivy 在这里所做的事情很重要。它不仅仅是将您的工件 jar 复制到 ivy 存储库 - 它还生成相关的“.ivy.xml”文件,这些文件指定每个工件的所有依赖项。

在幕后,ivy:retrieve 任务实际上也触发了ivy:resolve。当 ivy:resolve 发生时,一个文件被写入本地 ivy 缓存(在 user.home 中的 .ivy 文件夹中),该文件指定解析是如何发生的(需要哪些模块的修订来完成解析。)当@遇到 987654325@,该解析记录将从缓存中检索并用于为您的工件生成 ivy.xml。

我发现这样做的最大缺陷是要求ivy:resolveivy:publish 任务在由ant 执行时都由同一个类加载器加载。确保发生这种情况的最简单方法是在 taskdef 任务上使用 loaderRef。例如(注意匹配的 loaderRef 标签):

<taskdef name="ivy-retrieve" 
     classname="org.apache.ivy.ant.IvyRetrieve" 
     classpathref="ivy.lib" 
     loaderRef="ivy.loader"/>
<taskdef name="ivy-publish" 
     classname="org.apache.ivy.ant.IvyPublish" 
     classpathref="ivy.lib" 
     loaderRef="ivy.loader"/>

【讨论】:

以上是关于ivy:publish 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

每月第 5 个工作日的 TimeTrigger - 计划的 Web 作业 Azure

如何在 C# 中进行构造函数链接

javaoo总结一

如何使用junit编写测试类

它的工作原理:BigDecimal Sum with Reduce和BigDecimal :: add

Postgresql中的Inner Join子查询导致错误