69

我找不到关于 Ivy 依赖标签的conf属性的任何详尽解释:

<dependency org="hibernate" name="hibernate" rev="3.1.3" conf="runtime, standalone -> runtime(*)"/>

看到那个conf属性了吗?->我找不到关于符号右侧的任何解释(我能理解) 。请记住,我不知道关于 Maven 的第一件事,所以请考虑到这一点来解释这个属性。

是的,我已经看过这个:http ://ant.apache.org/ivy/history/latest-milestone/ivyfile/dependency.html

谢谢,

4

4 回答 4

81

首先,Ivy 不是 Maven ;)
Maven2 是一个软件项目管理和理解工具,而 Ivy 只是一个依赖管理工具。

Ivy 在很大程度上依赖于一个称为配置的独特概念。
在 Ivy 中,模块配置是一种使用或查看模块的方式。
例如,您可以在模块中进行测试和运行时配置。但您也可以拥有 MySQL 和 Oracle 配置。或者 Hibernate 和 JDBC 配置。

在每个配置中,您可以声明:

  • 需要什么工件(jar,war,...)。
  • 您对其他模块的依赖关系,并描述您需要的依赖项配置。这称为配置映射。

所以conf属性正是这样做的: 描述依赖项的配置映射。
映射的子元素是您的“符号右侧->”,表示映射的依赖项配置的名称。'*'通配符可用于指定该模块的所有配置。

在查理哈伯德的“常春藤配置的最简单解释”中查看更多信息

其中重要的部分是 Ivy 下载依赖项并组织它们。

一个常春藤模块(即ivy.xml文件)有两个主要部分:

  • 你需要什么依赖?
  • 你希望他们如何组织?

第一部分配置在<dependencies>元素下。
第二个由<configurations>元素控制

当 Ivy 下载这些依赖项时,它需要知道在拉取这些传递依赖项时要使用什么范围(我们是为了测试、运行时、编译等而拉取它吗?)。我们必须告诉 Ivy 如何将我们的配置映射到 Maven 范围,以便它知道要拉取什么。


Maven2 本身有一个叫做scope的东西。
您可以将依赖项声明为测试范围或构建时范围的一部分。
然后根据这个范围,您将获得依赖项工件(maven2 中每个模块只有一个工件),其依赖项取决于它们的范围。范围是在 maven2 中预定义的,您无法更改它。

这意味着:

许多库下载了很多不必要的依赖项
例如,Hibernate 下载一堆 JBoss JAR,而 Display Tag 下载所有各种 Web 框架 JAR。我发现自己排除了几乎和我添加的一样多的依赖项。

问题是 hibernate 可以与多个缓存实现、多个连接池实现一起使用……而这不能通过范围进行管理,而 Ivy 配置为此类问题提供了一个优雅的解决方案。
例如,在 Ivy 中,假设 hibernate 有一个像这样的 Ivy 文件,那么你可以像这样声明一个依赖项:

<dependency org="hibernate" name="hibernate" rev="2.1.8" conf="default->proxool,oscache"/>

使用它的 proxool 和 oscache 实现来休眠,就像这样:

<dependency org="hibernate" name="hibernate" rev="2.1.8" conf="default->dbcp,swarmcache"/>

使用 dbcp 和 swarmcache 进入休眠状态。

通过将您的默认master配置映射到“ proxool,oscache”或“ ”,您可以从模块“休眠”中准确dbcp,swarmcache指定您需要的内容。


您可以通过列出为与库关联的每个模块定义的 Ivy 配置来找到这些“proxool,...”参数。例如:

<ivy-module version="2.0">
<info organisation="ssn-src" module="pc"/>
<configurations defaultconfmapping="default->default">
    <conf name="default" />
    <conf name="provided" description="they are provided by the env." />
    <conf name="compile" extends="default,provided" />
    <conf name="war" extends="default"/>
</configurations>
<dependencies>

示例

假设modA有两个配置,默认和测试。
实际上,想要省略conf依赖元素的属性是非常不寻常的。for可能有依赖关系
ivy.xmlmodA

<dependency org="theteam" name="modB" rev="1.0" conf="default->*" />

您从默认开始,而不是从默认和测试开始。

上面的例子使 modA 的默认值依赖于 modB 的 conf1、conf2 和 conf3。
或者你可能想说 modA 的默认值只取决于 modB 的 conf1:

<dependency org="theteam" name="modB" rev="1.0" conf="default->*conf1*" />
于 2009-03-17T08:44:07.997 回答
20

我已经阅读了这些答案,坦率地说,我觉得它们没有多大帮助。我认为它们可以改进,所以我通过展示一个实际示例来写下我如何使用和理解配置:

http://wrongnotes.blogspot.com/2014/02/simplest-explanation-of-ivy.html

不幸的是,您必须对 maven 及其依赖有所了解,因为 Ivy 使用 Maven 存储库来下载这些 jar 文件。因此,Ivy 必须了解 Maven 并将其传递给您。但是,我认为我保持它非常简单,而没有过多地介绍有关 maven 的细节。

于 2014-02-17T22:02:42.020 回答
14

感谢VonC!

它进一步帮助了我。

当涉及到选项(配置)tieTYT 时,您可以在 Ivy 存储库中的 ivy-[revision number].xml 文件中找到它们:组织名称 --> 模块名称。

http://www.springsource.com/repository/app/下载的 JUnit 4.6 修订版的示例配置元素。

<configurations>
    <conf name="compile" visibility="public" description="Compile dependencies"/>
    <conf name="optional" visibility="public" extends="compile" description="Optional dependencies"/>
    <conf name="provided" visibility="public" description="Provided dependencies"/>
    <conf name="runtime" visibility="public" extends="compile" description="Runtime dependencies"/>
</configurations>

在我项目的 ivy.xml 文件中,我有一个配置编译测试。在依赖项元素中,我具有以下依赖项:

<dependency org="org.junit" name="com.springsource.org.junit"
        rev="4.6.0" conf="compile-test->compile" />

如您所见,我的编译测试配置依赖于 JUnit 的 ivy.xml 文件中的编译配置。

于 2009-07-31T20:50:36.627 回答
9

它曾经帮助我以这种方式理解事物:

  1. ivy 配置只是模块工件的某些子集的名称。
  2. 模块之间的依赖关系是根据配置名称指定的。
于 2010-05-04T17:15:15.010 回答