我一直在使用常春藤,但我似乎还有很多需要学习的东西。
我有两个项目。一个是Web应用程序,另一个是Web应用程序所依赖的库。设置是将库项目编译为jar文件,并使用Ivy将其发布到项目中的目录。在Web应用程序构建文件中,我有一个调用Ivy resolve ant任务的ant目标。
我想要做的是在开发期间(在开发人员的本地计算机上)使用动态解析模式的Web应用程序和测试和生产版本的默认解析模式。以前我在库存档文件中添加了一个时间戳,以便当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
网络应用解析目标如下所示:
<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的值为“dynamic”(不含引号)。
网络应用的常春藤文件很简单。它看起来像这样:
<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'。
有什么想法吗?如果我需要提供更多信息,请告诉我。
谢谢!
答案 0 :(得分:4)
我添加了以下内容,似乎有效。我会告诫这一点,我承认我也在与常春藤挣扎,而且我工作的很多东西都是黑盒子工作......也就是说它完成了工作所以我停止摆弄!我不敢说,我的理解不太先进。
Anwyay,在settings.xml中我添加了:
<modules>
<module organisation="my.organisation" name="*" resolveMode="dynamic"/>
</modules>
我认为它告诉ivy使用它的智能来处理这些模块。这种情报可能包括在解决时检查模块的更新版本。
此外,在解析器上,我添加了checkModified
和changingPattern
。在实际的解析器和包装链(如果有的话)上执行此操作非常重要:
<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
或者更适合你的东西。
答案 1 :(得分:3)
我认为您需要在webapp的常春藤文件中放弃使用 revConstraint 属性。
Ivy认为“latest.revision”是您想要检索的修订,而不是实际寻找最新版本: - )
我建议只按以下方式设置依赖关系:
<dependency name="library" rev="latest.integration"/>
说明:
发布模块时会设置revConstraint 。它在出版时记录了最新版本。所以你在开发过程中不需要它。您也不需要使用修订变量。当您使用“latest.revision”或“latest.release”修订引用发布ivy模块时,get解析并记录在 revConstraint 属性中。
有关详细信息,请参阅以下链接:
http://ant.apache.org/ivy/history/latest-milestone/ivyfile/dependency.html#revision-constraint