有人可以解释 ivy.xml 依赖项的 conf 属性吗?

Posted

技术标签:

【中文标题】有人可以解释 ivy.xml 依赖项的 conf 属性吗?【英文标题】:Can someone explain the ivy.xml dependency's conf attribute? 【发布时间】:2010-10-13 17:53:58 【问题描述】:

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

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

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

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

谢谢, 丹

【问题讨论】:

根据要求添加了更多细节 【参考方案1】:

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

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

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

需要哪些工件(jar、war、...)。 你对其他模块的依赖,并描述你需要的依赖配置。这称为配置映射。

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

在Charlie Hubbard的“Simplest Explanation of Ivy Configuration”上查看更多信息

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

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

您需要哪些依赖项? 您希望它们如何组织?

第一部分配置在&lt;dependencies&gt;元素下。 第二个由&lt;configurations&gt;元素控制

当 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”,您可以准确地从模块“hibernate”中指定所需的内容。


您可以通过列出为与库关联的每个模块定义的 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>

Example:

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

<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*" />

【讨论】:

好吧,我想我差不多明白了。但是你在哪里找到你的选择?你怎么知道你可以说 proxool,oscache/dbcp,swarmcache? “下载了不必要的依赖项”在 Maven 中是可寻址的,方法是排除默认的传递依赖项并明确您的选择。但我会第一个承认这绝不是“优雅”。 +1 表示非常清晰的响应;另见ant.apache.org/ivy/history/latest-milestone/tutorial/conf.html【参考方案2】:

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

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

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

【讨论】:

非常有用的文章,喜欢这个链接也不错,它解释了你需要知道的 maven 范围***.com/questions/7104364/…【参考方案3】:

感谢 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 文件中的编译配置。

【讨论】:

完全错过了你的答案。很好的插图。 +1【参考方案4】:

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

    ivy 配置只是模块工件的某些子集的名称。 模块之间的依赖关系是根据配置名称指定的。

【讨论】:

以上是关于有人可以解释 ivy.xml 依赖项的 conf 属性吗?的主要内容,如果未能解决你的问题,请参考以下文章

ivy xml的依赖标签中的传递字段有啥用?

从 Ivy.xml 下载依赖项

Ivy - 将解析结果输出到 ivy 文件

无法使用 ivy.xml 解决依赖关系,找不到模块错误

我们可以使用单独的解析器在 ivy ANT 中下载依赖项 jar 吗?

遗留存储库的 Ivy 依赖项管理