ANT Ivy:如何检索库并将其传递依赖项放在不同的文件夹中

时间:2016-09-28 00:51:16

标签: ant ivy

我正在开发一个分析Maven仓库中库的项目。我正在使用Ivy从Maven repo中检索库(例如log4j)。但Ivy也会在同一文件夹中下载其传递依赖项!我该如何分开它们?

1 个答案:

答案 0 :(得分:1)

秘诀是配置映射,常春藤中的强大概念。从常春藤存储库下载时,配置允许您配置可下载的文件的不同组合。例如,您可以指定只需要模块的已发布文件,或者只需要具有所有依赖项的已发布文件。这是一种非常灵活的功能。

当ivy从Maven存储库下载时,它使用了ibiblio解析器。 Maven存储库不支持配置,所以常春藤使它们成为一个标准集,我在这里有更详细的记录:

长话短说,当你指定一个依赖项时,配置映射会告诉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>

指定“主”配置

当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从远程配置中检索

使用常春藤文件

这是一个更复杂的例子,它展示了常春藤的真正力量以及如何指定多个配置和映射。这里我有两个目录。一个只有log4j jar,第二个另外包含远程模块的“可选”依赖项。如果你看远程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>