Ivy 无法下载位于本地 Maven 存储库中的工件的依赖项
Ivy cannot download dependencies of artifact located in a local Maven repostiory
我在本地 Maven 存储库中安装了工件 A。
工件 A 有许多依赖项 - 在其 pom 中正确指定。
如果我将 A 设置为 Maven 项目中的依赖项,一切正常 - 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 文件)。
我应该如何更改我的设置才能下载依赖项?
Maven 和 ivy 存储库具有不同的格式。简单的说Maven用的是POM文件,而ivy用的是ivy文件。
好消息是常春藤有一个特殊的ibiblio resolver which is designed to understand the format of a Maven respository. The bad news is that it does assume such a repository is running remotely, for example using software like Nexus, Artifactory or Achiva。
例如:
<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、等等
虽然 Mark O'Connor 的回答是一个正确的答案,也是解决问题的合理方法,但我设法找到了一个不同的解决方案,这意味着 imo 在设置方面的开销较小。
因此,我通过 Ant 任务 ivy:convertpom
将工件 A 的 POM 转换为 Ivy 文件。请注意,与 POM 标准相反,ivy 文件应按如下方式命名:ivy-<your lib revision>.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>
为了补充 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 依赖项。
我在本地 Maven 存储库中安装了工件 A。
工件 A 有许多依赖项 - 在其 pom 中正确指定。
如果我将 A 设置为 Maven 项目中的依赖项,一切正常 - 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 文件)。
我应该如何更改我的设置才能下载依赖项?
Maven 和 ivy 存储库具有不同的格式。简单的说Maven用的是POM文件,而ivy用的是ivy文件。
好消息是常春藤有一个特殊的ibiblio resolver which is designed to understand the format of a Maven respository. The bad news is that it does assume such a repository is running remotely, for example using software like Nexus, Artifactory or Achiva。
例如:
<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、等等
虽然 Mark O'Connor 的回答是一个正确的答案,也是解决问题的合理方法,但我设法找到了一个不同的解决方案,这意味着 imo 在设置方面的开销较小。
因此,我通过 Ant 任务 ivy:convertpom
将工件 A 的 POM 转换为 Ivy 文件。请注意,与 POM 标准相反,ivy 文件应按如下方式命名:ivy-<your lib revision>.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>
为了补充 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 依赖项。