ANT Ivy:如何检索库并将其传递依赖项放在不同的文件夹中
ANT Ivy: How to retrieve a library and put its transitive dependencies in different folder
我正在从事一个分析 Maven 存储库中的库的项目。我正在使用 Ivy 从 Maven 存储库中检索库(例如 log4j)。但是 Ivy 也会在同一个文件夹中下载它的传递依赖项!我如何将它们分开?
秘密是配置映射,ivy 中一个强大的概念。从 ivy 存储库下载时,配置允许您配置可以下载的不同文件组合。例如,您可以指定只需要模块的已发布文件,或包含所有依赖项的已发布文件。这是一个非常灵活的功能。
当 ivy 从 Maven 存储库下载时,它使用 ibiblio 解析器。 Maven 存储库不支持配置,所以 ivy 将它们组合起来并有一个标准集,我在此处进行了更详细的记录:
- How are maven scopes mapped to ivy configurations by ivy
长话短说,当您指定依赖项时,配置映射会告诉 ivy 从远程存储库检索哪些远程文件。我建议您始终指定配置并获得更多控制权。一旦你理解了配置,你就理解了 ivy。
例子
无配置
如果没有映射,将检索与远程 Maven 模块关联的所有文件。
├── build.xml
└── lib
├── activation-1.1.jar
├── geronimo-jms_1.1_spec-1.0.jar
├── javaee-api-5.0-2.jar
├── log4j-1.2.17.jar
├── log4j-1.2.17-javadoc.jar
├── log4j-1.2.17-sources.jar
└── mail-1.4.3.jar
构建文件:
<project name="demo" default="resolve" xmlns:ivy="antlib:org.apache.ivy.ant">
<target name="resolve">
<ivy:retrieve pattern="lib/[artifact]-[revision](-[classifier]).[ext]">
<dependency org="log4j" name="log4j" rev="1.2.17"/>
</ivy:retrieve>
</target>
</project>
指定"master"配置
当 ivy 读取远程 Maven 模块时,"master" 配置只是远程模块的文件,没有依赖项
├── build.xml
└── lib
└── log4j-1.2.17.jar
构建文件:
<project name="demo" default="resolve" xmlns:ivy="antlib:org.apache.ivy.ant">
<target name="resolve">
<ivy:retrieve pattern="lib/[artifact]-[revision](-[classifier]).[ext]">
<dependency org="log4j" name="log4j" rev="1.2.17" conf="master"/>
</ivy:retrieve>
</target>
</project>
备注:
- conf="master" 映射告诉 ivy 从远程 master 配置
检索
使用 ivy 文件
这是一个更复杂的示例,展示了 ivy 的真正力量以及如何指定多个配置和映射。这里我有两个目录。一个只有 log4j jar,第二个还包含远程模块的 "optional" 依赖项。如果您查看远程 POM,您会发现它们具有不同的范围。
├── build.xml
├── ivy.xml
├── lib1
│ └── log4j-1.2.17.jar
└── lib2
├── activation-1.1.jar
├── geronimo-jms_1.1_spec-1.0.jar
├── log4j-1.2.17.jar
└── mail-1.4.3.jar
构建文件
<project name="demo" default="resolve" xmlns:ivy="antlib:org.apache.ivy.ant">
<target name="resolve">
<ivy:resolve/>
<ivy:retrieve pattern="lib1/[artifact]-[revision](-[classifier]).[ext]" conf="noDependencies"/>
<ivy:retrieve pattern="lib2/[artifact]-[revision](-[classifier]).[ext]" conf="withDependencies"/>
</target>
</project>
常春藤档案
<ivy-module version="2.0">
<info organisation="com.myspotontheweb" module="demo"/>
<configurations>
<conf name="noDependencies" description="File grouping that has no transitive dependencies"/>
<conf name="withDependencies" description="File grouping that contains dependencies"/>
</configurations>
<dependencies>
<dependency org="log4j" name="log4j" rev="1.2.17" conf="noDependencies->master; withDependencies->master,optional"/>
</dependencies>
</ivy-module>
我正在从事一个分析 Maven 存储库中的库的项目。我正在使用 Ivy 从 Maven 存储库中检索库(例如 log4j)。但是 Ivy 也会在同一个文件夹中下载它的传递依赖项!我如何将它们分开?
秘密是配置映射,ivy 中一个强大的概念。从 ivy 存储库下载时,配置允许您配置可以下载的不同文件组合。例如,您可以指定只需要模块的已发布文件,或包含所有依赖项的已发布文件。这是一个非常灵活的功能。
当 ivy 从 Maven 存储库下载时,它使用 ibiblio 解析器。 Maven 存储库不支持配置,所以 ivy 将它们组合起来并有一个标准集,我在此处进行了更详细的记录:
- How are maven scopes mapped to ivy configurations by ivy
长话短说,当您指定依赖项时,配置映射会告诉 ivy 从远程存储库检索哪些远程文件。我建议您始终指定配置并获得更多控制权。一旦你理解了配置,你就理解了 ivy。
例子
无配置
如果没有映射,将检索与远程 Maven 模块关联的所有文件。
├── build.xml
└── lib
├── activation-1.1.jar
├── geronimo-jms_1.1_spec-1.0.jar
├── javaee-api-5.0-2.jar
├── log4j-1.2.17.jar
├── log4j-1.2.17-javadoc.jar
├── log4j-1.2.17-sources.jar
└── mail-1.4.3.jar
构建文件:
<project name="demo" default="resolve" xmlns:ivy="antlib:org.apache.ivy.ant">
<target name="resolve">
<ivy:retrieve pattern="lib/[artifact]-[revision](-[classifier]).[ext]">
<dependency org="log4j" name="log4j" rev="1.2.17"/>
</ivy:retrieve>
</target>
</project>
指定"master"配置
当 ivy 读取远程 Maven 模块时,"master" 配置只是远程模块的文件,没有依赖项
├── build.xml
└── lib
└── log4j-1.2.17.jar
构建文件:
<project name="demo" default="resolve" xmlns:ivy="antlib:org.apache.ivy.ant">
<target name="resolve">
<ivy:retrieve pattern="lib/[artifact]-[revision](-[classifier]).[ext]">
<dependency org="log4j" name="log4j" rev="1.2.17" conf="master"/>
</ivy:retrieve>
</target>
</project>
备注:
- conf="master" 映射告诉 ivy 从远程 master 配置 检索
使用 ivy 文件
这是一个更复杂的示例,展示了 ivy 的真正力量以及如何指定多个配置和映射。这里我有两个目录。一个只有 log4j jar,第二个还包含远程模块的 "optional" 依赖项。如果您查看远程 POM,您会发现它们具有不同的范围。
├── build.xml
├── ivy.xml
├── lib1
│ └── log4j-1.2.17.jar
└── lib2
├── activation-1.1.jar
├── geronimo-jms_1.1_spec-1.0.jar
├── log4j-1.2.17.jar
└── mail-1.4.3.jar
构建文件
<project name="demo" default="resolve" xmlns:ivy="antlib:org.apache.ivy.ant">
<target name="resolve">
<ivy:resolve/>
<ivy:retrieve pattern="lib1/[artifact]-[revision](-[classifier]).[ext]" conf="noDependencies"/>
<ivy:retrieve pattern="lib2/[artifact]-[revision](-[classifier]).[ext]" conf="withDependencies"/>
</target>
</project>
常春藤档案
<ivy-module version="2.0">
<info organisation="com.myspotontheweb" module="demo"/>
<configurations>
<conf name="noDependencies" description="File grouping that has no transitive dependencies"/>
<conf name="withDependencies" description="File grouping that contains dependencies"/>
</configurations>
<dependencies>
<dependency org="log4j" name="log4j" rev="1.2.17" conf="noDependencies->master; withDependencies->master,optional"/>
</dependencies>
</ivy-module>