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


68

我找不到有关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

Answers:


80

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

常春藤严重依赖于称为配置的独特概念。
在Ivy中,模块配置是使用或查看模块的一种方式
例如,您可以在模块中进行测试和运行时配置。但是您也可以使用MySQL和Oracle配置。或Hibernate和JDBC配置。

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

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

因此,conf属性精确地做到了这一点:描述依赖项的配置映射。
映射的子元素是你的“右手边->符号”,并表示映射的依赖配置的名称。'*'通配符可用于指定此模块的所有配置。

请参阅Charlie Hubbard的常春藤配置的最简单说明”中的更多内容

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

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

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

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

当Ivy下载这些依赖项时,它需要知道在提取这些传递性依赖项时要使用的范围(我们是否将其用于测试,运行时,编译等)?我们必须告诉Ivy如何将我们的配置映射到Maven范围,以便它知道要提取的内容。


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

这意味着:

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

问题是休眠可以与多个缓存实现,多个连接池实现一起使用,而... ...不能通过作用域进行管理,而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依赖项元素的属性将是非常不寻常的。
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*" />

6
好吧,我想我差不多了。但是,您在哪里找到您的选择?您怎么知道您可以说proxool,oscache / dbcp,swarmcache?
丹尼尔·卡普兰

2
通过排除默认的传递依赖项并使您的选择明确,可以在Maven中解决“下载的不必要的依赖项”的问题。但我将是第一个承认它绝不是“优雅”的人。
mezmo'8

2
+1,以获得非常清晰的响应;另请参见ant.apache.org/ivy/history/latest-milestone/tutorial/conf.html
Riccardo Cossu 2011年

19

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

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

不幸的是,您必须对maven及其依赖项有所了解,因为Ivy正在使用Maven存储库下载这些jar文件。因此,Ivy必须了解Maven,并将其传递给您。但是,我认为我保持了它的真正简单性,而没有过多地讨论Maven。


非常有用的文章,可能是不错的像这个链接,以及这也解释了Maven的作用域,你需要知道stackoverflow.com/questions/7104364/...
pvgoddijn

14

感谢VonC!

它进一步帮助了我。

关于选项(配置)tieTYT,您可以在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文件中,我有一个配置编译测试。在依赖性元素中,我具有以下依赖性:

<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. 常春藤配置只是模块工件的某些子集的名称。
  2. 模块之间的依赖关系是根据配置名称指定的。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.