Ivy的模块配置(module configurations)是一个很是重要的概念,Ivy里的configurations 能够理解为模块的概览。apache
以Ivy自带的例子学习,源代码位于src/example/configurations/multi-projects.api
里面有两个工程数组
-filter-framework 是一个库,定义了一个api来过滤字符串数组以及两个对该api的实现app
-myapp是一个很是小的app,它会使用到filter-framework。ide
filter-framework工程会产生3个组件:一个api jar,一个没有扩展依赖的对api的实现的jar,以及一个须要commons-collections去执行的实现jar。学习
咱们首先来看一下filter-framework工程。为了有一个更细粒度的组件发布定义,咱们定义了几个configurations,每个都映射到一组其余工程可使用的组件。测试
ivy.xml定义以下ui
<ivy-module version="1.0"> <info organisation="org.apache" module="filter-framework"/> <configurations> <conf name="api" description="only provide filter framework API"/> <conf name="homemade-impl" extends="api" description="provide a home made implementation of our api"/> <conf name="cc-impl" extends="api" description="provide an implementation that use apache common collection framework"/> <conf name="test" extends="cc-impl" visibility="private" description="for testing our framework"/> </configurations> <publications> <artifact name="filter-api" type="jar" conf="api" ext="jar"/> <artifact name="filter-hmimpl" type="jar" conf="homemade-impl" ext="jar"/> <artifact name="filter-ccimpl" type="jar" conf="cc-impl" ext="jar"/> </publications> <dependencies> <dependency org="commons-collections" name="commons-collections" rev="3.1" conf="cc-impl->default"/> <dependency org="junit" name="junit" rev="3.8" conf="test->default"/> </dependencies> </ivy-module>
如你所见,咱们定义了4个configurations,3个是public的,1个是private(junit用来测试的依赖)。spa
两个实现的配置,homemade-impl 和cc-impl 继承了api 配置,这样全部定义在api的组件都会是扩展配置的一部分code
在publications标签里,咱们定义了要生成的组件(在这里就是jar包),而且将他们分配给一个配置。当其余工程使用这个库时,它们就能够灵活的获取它们所须要的组件。
使用Ivy的publish任务咱们能够将这些组件发布到存储库里。而后其余工程就可使用这些发布上去的jar包。下面咱们就看看myapp是如何使用这些存储库里的组件的。
myapp的ivy.xml文件定义以下
<ivy-module version="1.0"> <info organisation="org.apache" module="myapp"/> <configurations> <conf name="build" visibility="private" description="compilation only need api jar" /> <conf name="noexternaljar" description="use only company jar" /> <conf name="withexternaljar" description="use company jar and third party jars" /> </configurations> <dependencies> <dependency org="org.apache" name="filter-framework" rev="latest.integration" conf="build->api; noexternaljar->homemade-impl; withexternaljar->cc-impl"/> </dependencies> </ivy-module>
咱们建立了3个配置来定义不一样的方式去使用该应用。build 配置定义了编译时的依赖,所以编译时只须要filter-framework工程的api配置。其余两个配置定义了运行时的依赖。一个只使用"home-made"jar包,另一个则须要用到扩展jar包。
咱们还定义了一个对以前库的依赖。在这个依赖里,咱们使用配置映射来匹配咱们的配置和所依赖的组件的配置。
1.build->api: 咱们告诉Ivy build配置依赖于依赖模块的api配置
2.noexternaljar->homemade-impl:意思是咱们的noexternaljar配置依赖于所依赖模块的homemade-impl配置
3.withexternaljar->cc-impl: 是说咱们的withexternaljar配置依赖于所依赖模块的cc-impl配置。
请注意咱们并无在每一个配置里声明任何咱们须要依赖的组件,是依赖模块的的ivy文件声明了要发布的组件以及每一个组件应用于哪一个配置。
在Ant build.xml文件里,咱们定义了“resolve” target:
<target name="resolve" description="--> retreive dependencies with ivy"> <ivy:retrieve pattern="${ivy.lib.dir}/[conf]/[artifact].[ext]"/> </target>
当咱们调用该target时,Ivy将会使用咱们的ivy.xml文件作解析而且检索全部的组件。全部检索到的组件将会根据它所属的配置存放在不一样的文件夹里。
而后咱们在运行的时候就能够指定不一样的路径做为classpath来启动应用,以达到不一样的运行结果和目的。
咱们应该尽量多的使用configurations,它是Ivy很是重要的概念。使用configurations你能够将组件根据不一样的用途分类,当你为工程编写ivy文件,而且这些工程是准备给其余人使用的,用configurations可使使用者只得到他们所须要的,而不须要使用者在它们的依赖列表里逐个指定。