有人能解释一下ivy.xml中依赖的conf属性吗?

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

谢谢,


根据要求,添加了更多细节。 - VonC
4个回答

82
首先,Ivy不是Maven ;)。 Maven2是一个软件项目管理和理解工具,而Ivy仅是一个依赖管理工具。
Ivy在很大程度上依赖于一个称为配置的独特概念。在Ivy中,模块配置是使用或查看模块的一种方式。例如,您可以在模块中有测试和运行时配置。但是您还可以有MySQL和Oracle配置。或者有Hibernate和JDBC配置。
在每个配置中,您可以声明:
- 需要哪些工件(jar、war等)。 - 您对其他模块的依赖关系,并描述您需要依赖关系的哪个配置。这称为配置映射。
因此,conf属性正是如此:为依赖项描述配置映射。 mapped子元素 是您“->”符号的右侧,并表示映射的依赖项配置名称。 '*'通配符可用于指定此模块的所有配置。
更多信息请参见Charlie Hubbard的Ivy配置最简单的解释

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

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

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

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

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


Maven2另一方面有一个称为范围的东西。您可以将依赖项声明为测试范围或构建时范围。然后,根据此范围,您将获取依赖关系工件(在maven2中每个模块仅有一个工件),以及其依赖项,具体取决于它们的范围。在maven2中,范围是预定义的,您无法更改。
这意味着:

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

问题在于Hibernate可以与多个缓存实现、多个连接池实现等一起使用,而这不能通过范围来管理。而Ivy配置为此类问题提供了优雅的解决方案。例如,在Ivy中,假设Hibernate有像

要使用Hibernate及其Proxool和OSCache的实现,可以像这样:

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

如何使用dbcp和swarmcache实现Hibernate。

通过将默认的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>

示例

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

6
好的,我觉得我差不多懂了。但是你在哪里找到这些选项?你怎么知道可以使用proxool、oscache/dbcp和swarmcache呢? - Daniel Kaplan
2
那个“不必要的依赖下载”可以通过在Maven中排除默认传递依赖项并明确选择来解决。但我必须承认,这绝不是“优雅”的解决方案。 - mezmo
2
+1 对于非常清晰的回答;请参阅http://ant.apache.org/ivy/history/latest-milestone/tutorial/conf.html - Riccardo Cossu
我认为配置的概念相对容易理解,如果你正在构建自己的项目并链接到自己的依赖项。Ivy文档的失败之处在于解释conf的最常见用法,以及它如何影响从Maven仓库中检索(Hubbard对此进行了出色的解释)。 - Shane Gillis
@ShaneGillis 我同意。你有找到这个话题的其他文档来源吗? - VonC
显示剩余3条评论

21

我已经阅读了这些答案,坦白地说,我并不认为它们很有帮助。我认为它们可以改进,因此我写下了如何通过展示实际示例来使用和理解配置的方法:

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

不幸的是,您需要了解一些关于Maven及其依赖项的知识,因为Ivy使用Maven仓库来下载这些JAR文件。因此,Ivy必须了解Maven,并将其传递给您。但是,我认为我没有过多深入细节,保持了真正的简单。


非常有用的文章,可能也很好将此链接添加到其中,该链接解释了您需要了解的Maven作用域:https://dev59.com/rGw05IYBdhLWcg3wqzis - pvgoddijn

14

谢谢VonC!

这对我帮助很大。

关于选项(配置),你可以在你的Ivy存储库中的ivy-[版本号].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文件中,我有一个名为compile-test的配置。在依赖项元素中,我有以下依赖项:

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

正如您所看到的,我的编译测试配置取决于JUnit的ivy.xml文件中的编译配置。


1
完全错过了你的回答。很好的例子。+1 - VonC

9

我曾经通过以下方式理解这些内容:

  1. Ivy配置仅是模块的某些子集的名称。
  2. 模块之间的依赖关系是用配置名称来指定的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接