常春藤解决不使用动态工件

Posted

技术标签:

【中文标题】常春藤解决不使用动态工件【英文标题】:Ivy resolve not working with dynamic artifact 【发布时间】:2011-02-14 11:21:42 【问题描述】:

我一直在使用 Ivy,但我似乎还有很多东西要学。

我有两个项目。一个是 Web 应用程序,另一个是 Web 应用程序所依赖的库。设置是将库项目编译为 jar 文件并使用 Ivy 发布到项目中的目录。在 Web 应用程序构建文件中,我有一个调用 Ivy 解析 ant 任务的 ant 目标。

我想做的是让 Web 应用在开发期间(在开发人员的本地计算机上)使用动态解析模式,并为测试和生产构建使用默认解析模式。以前我在库存档文件中附加了一个时间戳,这样当网络应用程序试图解决它对它的依赖时,Ivy 会注意到文件的变化。在 Eclipse 中,这很麻烦,因为在 Web 应用程序中,每次发布新的库 jar 时都必须刷​​新项目并调整构建路径。我认为,每次发布一个类似命名的 jar 文件只需要开发人员刷新项目。

问题是 web 应用无法检索动态 jar 文件。

我得到的输出看起来像这样:

resolve:
[ivy:configure] :: Ivy 2.1.0 - 20090925235825 :: http://ant.apache.org/ivy/ ::
[ivy:configure] :: loading settings :: file = /Users/richard/workspace/webapp/web/WEB-INF/config/ivy/ivysettings.xml
[ivy:resolve] :: resolving dependencies :: com.webapp#webapp;working@hoth-3.local
[ivy:resolve]   confs: [default]
[ivy:resolve]   found com.webapp#library;latest.integration in local
[ivy:resolve] :: resolution report :: resolve 142ms :: artifacts dl 0ms
---------------------------------------------------------------------
|                  |            modules            ||   artifacts   |
|       conf       | number| search|dwnlded|evicted|| number|dwnlded|
---------------------------------------------------------------------
|      default     |   1   |   0   |   0   |   0   ||   0   |   0   |
---------------------------------------------------------------------
[ivy:resolve] 
[ivy:resolve] :: problems summary ::
[ivy:resolve] :::: WARNINGS
[ivy:resolve]       ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:resolve]       ::          UNRESOLVED DEPENDENCIES         ::
[ivy:resolve]       ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:resolve]       :: com.webapp#library;latest.integration: impossible to resolve dynamic revision
[ivy:resolve]       ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:resolve] :::: ERRORS
[ivy:resolve]   impossible to resolve dynamic revision for com.webapp#library;latest.integration: check your configuration and make sure revision is part of your pattern
[ivy:resolve] 
[ivy:resolve] :: USE VERBOSE OR DEBUG MESSAGE LEVEL FOR MORE DETAILS

BUILD FAILED 
/Users/richard/workspace/webapp/build.xml:71: impossible to resolve dependencies:
resolve failed - see output for details

Web 应用解析目标如下所示:

<target name="resolve" depends="load-ivy">
    <ivy:configure file="$ivy.dir/ivysettings.xml" />

    <ivy:resolve 
        file="$ivy.dir/ivy.xml" 
        resolveMode="$ivy.resolve.mode"/>

    <ivy:retrieve pattern="$lib.dir/[artifact]-[revision].[ext]" type="jar" sync="true" />
</target> 

在这种情况下,ivy.resolve.mode 的值为“动态”(不带引号)。

网络应用的 Ivy 文件很简单。它看起来像这样:

<ivy-module version="2.0" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">

    <info organisation="com.webapp" module="webapp"/>

    <dependencies>
        <dependency name="library" rev="$ivy.revision.default" revConstraint="$ivy.revision.dynamic" />
    </dependencies>

</ivy-module>

在开发过程中,ivy.revision.dynamic 的值为 'latest.integration'。而在生产或测试期间,“ivy.revision.default”的值为“1.0”。

有什么想法吗?如果我需要提供更多信息,请告诉我。

谢谢!

【问题讨论】:

【参考方案1】:

我添加了以下内容,它似乎有效。我会警告这一点,承认我也在与常春藤斗争,而且我工作的很多东西几乎都是黑盒工作......即它完成了工作,所以我停止摆弄!恐怕我的理解还不够先进。

Anwyay,我在 settings.xml 中添加了:

 <modules>
     <module organisation="my.organisation" name="*" resolveMode="dynamic"/>
 </modules>

我认为这告诉 ivy 使用它的智能来处理这些模块。该情报可能包括在解析时检查模块的更新版本。

另外,在解析器上我添加了checkModifiedchangingPattern。显然,在实际的解析器和包装链上都这样做很重要(如果你有的话):

<chain name="foo" checkmodified="true"  changingPattern=".*-SNAPSHOT">
    <url name="bar" checkmodified="true" changingPattern=".*-SNAPSHOT">  
       <ivy pattern=... />  
       <artifact pattern=... /> 
    </url>  
    ...
</chain>

checkModified 希望能如其所言。我收集到changingPattern 告诉 ivy 检查包含此模式的工件是否在 repo 中有新的更新。我个人使用的是 maven repo,其中可修改的东西总是附加了 -SNAPSHOT 所以这就是我使用它的原因(我认为这很常见)。我想你可以用“。*”或更适合你的东西替换这个changingPattern

【讨论】:

【参考方案2】:

我认为您需要在 webapp 的 ivy 文件中放弃使用 revConstraint 属性。

Ivy 认为“latest.revision”是您要检索的修订版,而不是实际寻找最新修订版 :-)

我建议将依赖项设置如下:

<dependency name="library" rev="latest.integration"/>

解释:

revConstraint 在您发布模块时设置。它记录了出版时的最新版本。所以你在开发过程中不需要它。您也不需要使用修订变量。当您发布带有“latest.revision”或“latest.release”修订版的常春藤模块时,将解析并记录在 revConstraint 属性中。

查看以下链接了解更多信息:

http://ant.apache.org/ivy/history/latest-milestone/ivyfile/dependency.html#revision-constraint

【讨论】:

谢谢,马克,但这仍然不能解决我的问题。我已经按照您的指示更改了依赖项,在“默认”和“动态”之间改变了 webapp 解析目标中 resolveMode 的值,并完全删除了它,但 webapp 仍然没有“拾取”库 jar 的最新发布.做更多的研究让我明白了这一点:ant.apache.org/ivy/history/latest-milestone/concept.html#change 但是,在本地解析器上使用 checkmodified 也不起作用。我一定还没有正确理解某些东西。 我也试过添加changePattern无济于事:库jar被命名为libra-dev.jar。 你能用新的常春藤输出更新你的帖子吗?您还可以包括您的 ivysettings 文件(如果您使用的是一个)

以上是关于常春藤解决不使用动态工件的主要内容,如果未能解决你的问题,请参考以下文章

常春藤从常春藤缓存中删除不需要的(旧)工件

Gradle:如何按模式包含常春藤工件?

常春藤不使用分类器拉动对 jar 的传递依赖

MultipartFile 动态决定是否上传文件,解决不上传文件报错

如何使用 ivy 和 nexus 发布 3rdparty 工件

将工件从一个 Ivy 存储库发布/复制到另一个存储库