有人可以解释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。
通过将您的默认master
configuration映射到“ 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
属性是非常不寻常的。
modA
的ivy.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的细节。
它帮助我以这种方式理解事情:
- 常青藤configuration只是模块工件的某个子集的名称。
- 模块之间的依赖关系通过configuration名称来指定。