【问题标题】:Ivy cannot download dependencies of artifact located in a local Maven repostioryIvy 无法下载位于本地 Maven 存储库中的工件的依赖项
【发布时间】:2016-04-18 09:30:19
【问题描述】:

我在本地 Maven 存储库中安装了一个工件 A。

工件 A 有许多依赖项 - 在其 pom 中正确指定。

如果我在 Maven 项目中将 A 设置为依赖项,一切正常 - A 及其依赖项都已正确下载。这告诉我 A 已正确安装在本地 Maven 存储库中,并且它的依赖项已正确指定。

我还有一个 Ant/Ivy 项目。我已通过以下方式配置了 ivysettings.xml(遵循从另一个答案中获取的建议):

<ivysettings>
    <settings defaultResolver="default"/>
    <property name="m2-pattern" value="${user.home}/.m2/repository/[organisation]/[module]/[revision]/[module]-[revision](-[classifier]).[ext]"     override="false" />
    <resolvers>
        <chain name="default">
            <filesystem name="local-maven2" m2compatible="true" >
                <artifact pattern="${m2-pattern}"/>
                <ivy pattern="${m2-pattern}"/>
            </filesystem>
            <ibiblio name="central" m2compatible="true"/>
        </chain>
    </resolvers>
</ivysettings>

通过这个配置,Ivy 正确下载了 A,但不是它的依赖项(似乎完全忽略了它的 pom 文件)。

我应该如何更改我的设置,以便同时下载依赖项?

【问题讨论】:

    标签: ivy


    【解决方案1】:

    尽管 Mark O'Connor 的答案是正确的答案和解决问题的合理方法,但我设法找到了一个不同的解决方案,这意味着在设置方面的开销较小。

    因此,我通过 Ant 任务 ivy:convertpom 将工件 A 的 POM 转换为 Ivy 文件。请注意,与 POM 标准相反,Ivy 文件应命名为:ivy-&lt;your lib revision&gt;.xml

    然后,我刚刚配置了一个本地Ivy仓库,指向工件A及其Ivy文件所在的文件夹,如:

    <ivysettings>
        <property name="my-local-ivy-dependencies-jars.repository" value="${user.dir}\..\my-local-ivy-dependencies-jars/lib"/>
        <property name="my-local-ivy-dependencies-jars.pattern" value="${my-local-ivy-dependencies-jars.repository}/[organisation]/jars/[artifact]-[    revision].[ext]"/>
        <settings defaultResolver="default"/>
        <resolvers>
            <chain name="default">
                <filesystem name="my-local-ivy-dependencies-jars">
                    <ivy pattern="${my-local-ivy-dependencies-jars.pattern}" />
                    <artifact pattern="${my-local-ivy-dependencies-jars.pattern}" />
                </filesystem>
                <ibiblio name="central" m2compatible="true"/>
            </chain>
        </resolvers>
    </ivysettings>
    

    【讨论】:

      【解决方案2】:

      为了补充 Mark O'Connor 的回答,您实际上可以使用带有 file:// 方案的本地 URL。以下在 Windows 上适用于我(注意方案后的三斜杠):

      <ivysettings>
          <settings defaultResolver="local-maven" />
          <resolvers>
              <ibiblio name="local-maven" m2compatible="true" 
                  root="file:///c:/path/to/maven/repo"
                  pattern="[orgPath]/[module]/[revision]/[artifact]-[revision].[type]"/>
          </resolvers>
      </ivysettings>
      

      我的使用是在使用 ivy 的 ant 构建中检索 android sdk 依赖项。

      【讨论】:

        【解决方案3】:

        Maven 和 ivy 存储库具有不同的格式。简单地说,Maven 使用 POM 文件,而 ivy 使用 ivy 文件。

        好消息是 ivy 有一个特殊的 ibiblio 解析器,旨在理解 Maven 存储库的格式。坏消息是它确实假设这样的存储库是远程运行的,例如使用像 NexusArtifactoryAchiva 这样的软件。

        例如:

        <ivysettings>
            <settings defaultResolver="repos" />
            <resolvers>
                <chain name="repos">
                    <ibiblio name="central" m2compatible="true"/>   
                    <ibiblio name="my-releases" m2compatible="true" root="https://myhost/releases"/>   
                </chain>
            </resolvers>
        </ivysettings>
        

        演示如何从 Maven central 和本地运行的 Maven 存储库中提取依赖项

        总之,在本地运行 Maven 存储库并不难,并且是在各种构建技术之间共享工件的最佳方式:Maven、ANT/ivy、Gradle、SBT 等。

        【讨论】:

          猜你喜欢
          • 2020-07-13
          • 2013-09-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-12
          • 2018-02-27
          • 1970-01-01
          • 2019-02-01
          相关资源
          最近更新 更多