Ivy Configurations

江宏伟
2023-12-01

Ivy的模块配置(module configurations)是一个非常重要的概念,Ivy里的configurations 可以理解为模块的概览。

以Ivy自带的例子学习,源代码位于src/example/configurations/multi-projects.

里面有两个工程

-filter-framework 是一个库,定义了一个api来过滤字符串数组以及两个对该api的实现

-myapp是一个非常小的app,它会使用到filter-framework。

filter-framework工程会产生3个组件:一个api jar,一个没有扩展依赖的对api的实现的jar,以及一个需要commons-collections去执行的实现jar。

我们首先来看一下filter-framework工程。为了有一个更细粒度的组件发布定义,我们定义了几个configurations,每一个都映射到一组其他工程可以使用的组件。

ivy.xml定义如下

<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用来测试的依赖)。

两个实现的配置,homemade-impl 和cc-impl 继承了api 配置,这样所有定义在api的组件都会是扩展配置的一部分

在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可以使使用者只获得他们所需要的,而不需要使用者在它们的依赖列表里逐个指定。




转载于:https://my.oschina.net/u/134516/blog/195569

 类似资料:

相关阅读

相关文章

相关问答