如何解决在Apache Ivy中,同一文件中检索到模块X的多个工件的问题?

23

我曾使用ANT将我的内容部署到Tomcat上。但是我遇到了缺少依赖项的问题,我想添加Ivy,因为它被推荐使用。

现在我把这个添加到了我的build.xml文件中:

<!-- Ivy settings start-->

    <condition property="ivy.home" value="${env.IVY_HOME}">
        <isset property="env.IVY_HOME" />
    </condition>


    <target name="download-ivy" unless="offline" description="Download Ivy">
        <mkdir dir="${ivy.jar.dir}"/>
            <!-- download Ivy from web site so that it can be used even without any special installation -->
        <get src="http://repo2.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar" 
            dest="${ivy.jar.file}" usetimestamp="true"/>
    </target>


    <target name="init-ivy" depends="download-ivy" description="Initialize Ivy">
        <!-- try to load ivy here from ivy home, in case the user has not already dropped
        it into ant's lib dir (note that the latter copy will always take precedence).
        We will not fail as long as local lib dir exists (it may be empty) and
        ivy is in at least one of ant's lib dir or the local lib dir. -->
        <path id="ivy.lib.path">
            <fileset dir="${ivy.jar.dir}" includes="*.jar"/>
        </path>
        <taskdef resource="org/apache/ivy/ant/antlib.xml"
        uri="antlib:org.apache.ivy.ant" classpathref="ivy.lib.path"/>
    </target>

    <target name="update" depends="init-ivy" description="Download project dependencies">
        <!-- edited for brevity -->

        <ivy:retrieve pattern="lib/[conf]/[artifact]-[revision].[ext]" />
        <!-- edited for brevity -->
    </target>


    <target name="clean-all" depends="clean" description="Purge ivy cache">
        <ivy:cleancache/>
    </target>

<!-- Ivy settings end-->

这是我的ivy.xml文件:

<ivy-module version="2.0">
    <info organisation="org.apache" module="hello-ivy"/>
    <dependencies>
        <dependency org="commons-lang" name="commons-lang" rev="2.1"/>
    </dependencies>
</ivy-module>
这是我的日志:
Buildfile: C:\Users\Jansu\workspace\HelloWorld\build.xml
download-ivy:
      [get] Getting: http://repo2.maven.org/maven2/org/apache/ivy/ivy/2.2.0/ivy-2.2.0.jar
      [get] To: C:\Users\Jansu\.ant\lib\ivy-2.2.0.jar
      [get] Not modified - so not downloaded
init-ivy:
update:
[ivy:retrieve] :: Ivy 2.2.0 - 20100923230623 :: http://ant.apache.org/ivy/ ::
[ivy:retrieve] :: loading settings :: url = jar:file:/C:/Users/Jansu/.ant/lib/ivy-2.2.0.jar!/org/apache/ivy/core/settings/ivysettings.xml
[ivy:retrieve] :: resolving dependencies :: org.apache#hello-ivy;working@Jansu-PC
[ivy:retrieve]  confs: [default]
[ivy:retrieve]  found commons-lang#commons-lang;2.1 in public
[ivy:retrieve] downloading http://repo1.maven.org/maven2/commons-lang/commons-lang/2.1/commons-lang-2.1.jar ...
[ivy:retrieve] ................................................................................................................................................................................................................................................................................................................................................................................................................. (202kB)
[ivy:retrieve] .. (0kB)
[ivy:retrieve]  [SUCCESSFUL ] commons-lang#commons-lang;2.1!commons-lang.jar (1704ms)
[ivy:retrieve] downloading http://repo1.maven.org/maven2/commons-lang/commons-lang/2.1/commons-lang-2.1-sources.jar ...
[ivy:retrieve] ........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ (255kB)
[ivy:retrieve] .. (0kB)
[ivy:retrieve]  [SUCCESSFUL ] commons-lang#commons-lang;2.1!commons-lang.jar(source) (1819ms)
[ivy:retrieve] downloading http://repo1.maven.org/maven2/commons-lang/commons-lang/2.1/commons-lang-2.1-javadoc.jar ...
[ivy:retrieve] .........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
[ivy:retrieve] ................................................................................................................................................................................................................................................................ (518kB)
[ivy:retrieve] .. (0kB)
[ivy:retrieve]  [SUCCESSFUL ] commons-lang#commons-lang;2.1!commons-lang.jar(javadoc) (2817ms)
[ivy:retrieve] :: resolution report :: resolve 2094ms :: artifacts dl 6357ms
    ---------------------------------------------------------------------
    |                  |            modules            ||   artifacts   |
    |       conf       | number| search|dwnlded|evicted|| number|dwnlded|
    ---------------------------------------------------------------------
    |      default     |   1   |   1   |   1   |   0   ||   3   |   3   |
    ---------------------------------------------------------------------
[ivy:retrieve] :: retrieving :: org.apache#hello-ivy
[ivy:retrieve]  confs: [default]

这是错误信息:

BUILD FAILED
    C:\Users\Jansu\workspace\HelloWorld\build.xml:177: impossible to ivy retrieve: java.lang.RuntimeException: problem during retrieve of org.apache#hello-ivy: java.lang.RuntimeException: Multiple artifacts of the module commons-lang#commons-lang;2.1 are retrieved to the same file! Update the retrieve pattern  to fix this error.

    Total time: 11 seconds

看起来错误是由这个模式引起的?:

<ivy:retrieve pattern="lib/[conf]/[artifact]-[revision].[ext]" />

但在我看来,它看起来很稳固。

有什么建议吗?

1个回答

36

您需要扩展模式以包含类型,这样每个工件都可以有自己的本地文件:

<ivy:retrieve pattern="lib/[conf]/[artifact]-[type]-[revision].[ext]" />

或者如果你不需要源代码和javadoc,你可以将依赖项更改为:

<ivy-module version="2.0">
    <info organisation="org.apache" module="hello-ivy"/>
    <dependencies>
        <dependency org="commons-lang" name="commons-lang" rev="2.1" conf="default->master"/>
    </dependencies>
</ivy-module>

这将仅检索依赖项的master-conf(jar)。


我得到了这个 `[ivy:retrieve] Problem occurred while parsing ivy file: Cannot add dependency 'commons-lang#commons-lang;2.1' to configuration 'master' of module org.apache#hello-ivy;working@Jansu-PC because this configuration doesn't exist! in file:/C:/Users/Jansu/workspace/HelloWorld/ivy.xmlBUILD FAILED`。 - Jaanus
现在它可以工作了,谢谢。但是你怎么知道在 conf= 后面写什么呢?这就是我需要了解的关于ivy的全部吗?现在我只需在这里编写新的依赖项,它就会下载所有依赖项。为什么这比手动下载更好呢?只是因为它可以节省几秒钟时间或者还有其他原因吗? - Jaanus
4
“Saves some seconds”可以译为“能节省几秒钟”,而“How about saves some hours”则可以译为“何不节省几个小时呢?”在使用Ivy/Maven之前,我花费了数天的时间,反复发现并下载各种依赖层。 - slim
https://stackoverflow.com/a/40820025/1901067[artifact]-[revision](-[classifier]).[ext] - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接