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

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

谢谢,

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

常春藤很大程度上依赖于一个称为configuration的独特概念。
在ivy中,模块configuration是一种使用或查看模块的方式
例如,您可以在模块中进行testing和运行时configuration。 但是你也可以有一个mysql和一个oracleconfiguration。 或者一个hibernate和一个jdbcconfiguration。

在每个configuration中,你可以声明:

  • 什么工件(jar,war,…)是必需的。
  • 你对其他模块的依赖,并描述你所需要的依赖的configuration。 这被称为configuration映射。

所以conf属性的确如此:描述一个依赖关系的configuration映射。
映射的子元素是您的“ ->符号的右侧”,并表示映射的依赖关系configuration的名称。 '*'通配符可用于指定此模块的所有configuration。


Maven2在它旁边有一个叫范围的东西。
您可以声明一个依赖项作为testing范围的一部分,或者构build时间范围。
然后根据这个范围,你将得到它的依赖关系取决于它们的作用域的依赖性工件(每个模块在maven2中只有一个工件)。 范围是在maven2中预定义的,你不能改变它。

这意味着:

为许多库下载了许多不必要的依赖关系。
例如,Hibernate下载了一堆JBoss JAR,显示标签下载了所有的各种Web框架JAR。 我发现自己排除了我添加的几乎所有依赖项。

问题是hibernate可以和几个caching实现一起使用,有几个连接池实现,这个不能用scope来pipe理,Ivyconfiguration提供了一个优雅的解决scheme来解决这类问题。
例如,在ivy中, 假设hibernate有一个像这样的ivy文件 ,那么你可以像这样声明一个依赖关系:

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

通过它的proxool和oscache实现来hibernate,就像这样:

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

使用dbcp和swarmcache进行hibernate。

通过将您的默认masterconfiguration映射到“ proxool,oscache ”或“ dbcp,swarmcache ”,您可以从“hibernate”模块中指定您需要的内容。


您可以通过列出为与库关联的每个模块定义的ivyconfiguration来find这些“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有两个configuration,默认和testing。
实际上,想要省略依赖项元素的conf属性是非常不寻常的。
modAivy.xml可能有一个依赖关系:

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

你从默认开始,而不是从默认和testing。

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

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

谢谢VonC!

它帮助了我更多。

当涉及选项(configuration)tieTY,你可以在你的Ivy仓库的ivy- [revision number] .xml文件中find它们:organization name – > module name。

来自http://www.springsource.com/repository/app/的JUnit 4.6版本的示例configuration元素。

 <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文件中,我有一个configuration编译testing。 在依赖项元素中,我有以下依赖项:

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

正如你所看到的,我的编译testingconfiguration依赖于JUnit的ivy.xml文件中的编译configuration。

我已经阅读了这些答案,坦率地说,我不觉得他们非常有帮助。 我认为他们可以改进,所以我通过举例说明了如何使用和理解configuration:

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

不幸的是,你必须了解一些关于maven及其依赖的知识,因为常青藤使用Maven仓库来压缩这些jar文件,所以常青藤必须了解Maven,并把它传递给你。 但是,我认为我保持真实的简单,而不用过多的关于maven的细节。

它帮助我以这种方式理解事情:

  1. 常青藤configuration只是模块工件的某个子集的名称。
  2. 模块之间的依赖关系通过configuration名称来指定。