当前位置: 首页 > 工具软件 > Apache Ivy > 使用案例 >

Apache Ivy之多个解析器

程英资
2023-12-01


前言

本教程是一个如何由多个解析器检索模块的示例。在许多情况下,使用多个解析器可能很有用。例如:

  1. 将集成构建与发布分离
  2. 对第三方模块使用公共存储库,对内部模块使用私有存储库
  3. 使用存储库存储在非托管公共存储库中不准确的模块
  4. 使用本地存储库公开在一个开发人员工作站上生成的版本
    在Ivy中,多个解析器是通过一个复合解析器即链解析器来支持。在我们的示例中,我们将简单地向您展示如何使用两个解析器,一个用于本地存储库,另一个使用maven2存储库。

一、Project Description

1. 项目:链式解析器

项目非常简单,只包含一个简单类:example.Hello.
它依赖于两个库:Apache的commons-lang和一个名为test的自定义库(源代码包含在test-1.0.jar文件中)。项目使用test库将字符串大写,使用commons-lang将同一字符串的首字母大写。

项目内容如下:

  • build.xml:项目的Ant生成文件
  • ivy.xml:Ivy项目文件
  • src/example/Hello.java:项目的示例类文件

让我们看一下ivy.xml文件:

<ivy-module version="1.0">
    <info organisation="org.apache" module="chained-resolvers"/>
    <dependencies>
        <dependency org="commons-lang" name="commons-lang" rev="2.6" conf="default"/>
        <dependency name="test" rev="1.0"/>
    </dependencies>
</ivy-module>

正如我们所期望的,Ivy文件声明这个模块依赖使用的两个库:commons-lang和test。注意,我们没有为依赖test指定组织。当我们不指定org时,Ivy假设它与声明模块位于同一个org中。(在本例中为,org.apache)

2. The Ivy Settings

Ivy的设置在ivysettings.xml文件中,该文件位于项目的settings目录中。下面是它的内容,然后是它所做的解释。

<ivysettings>
  <settings defaultResolver="chain-example"/>
  <resolvers>
    <chain name="chain-example">
      <filesystem name="libraries">
        <artifact pattern="${ivy.settings.dir}/repository/[artifact]-[revision].[ext]"/>
      </filesystem>
      <ibiblio name="ibiblio" m2compatible="true"/>
    </chain>
  </resolvers>
</ivysettings>

The settings tag:这个标签用一些参数初始化Ivy。这里只设置了一个参数,默认情况下使用的解析器的名称。
The resolvers tag:resolvers部分定义了Ivy用来加载工件的解析器列表。在我们的示例中,只有一个名为chain-example的解析器,它的独特之处在于它定义了一个解析器列表(因此是一个链)。这个链中的解析器是:

  • libraries :它是一个文件系统解析器,即查看一个目录结构来检索工件。
  • ibiblio:它在ibiblio Maven存储库中查找以检索工件

就这样,我们刚刚配置了一个解析器链!

二、Walkthrough

1:准备

  • 打开shell(或命令行)窗口,转到src/example/chained-resolvers目录。

2:清除目录树

  • 命令行执行命令:ant
    • 这将清除整个项目目录树和Ivy缓存。每次您想清理这个示例时都可以这样做。

3:运行项目

  • 进入chainedresolvers-project项目目录,只需执行ant命令即可。
[ivy@apache:/ivy/chained-resolvers/chainedresolvers-project]$ ant
Buildfile: /ivy/chained-resolvers/chainedresolvers-project/build.xml

resolve:
[ivy:retrieve] :: Apache Ivy 2.5.0 - 20191020104435 :: https://ant.apache.org/ivy/ ::
[ivy:retrieve] :: loading settings :: file = /ivy/chained-resolvers/settings/ivysettings.xml
[ivy:retrieve] :: resolving dependencies :: org.apache#chained-resolvers;working@apache
[ivy:retrieve] 	confs: [default]
[ivy:retrieve] 	found commons-lang#commons-lang;2.6 in ibiblio
[ivy:retrieve] 	found org.apache#test;1.0 in libraries
[ivy:retrieve] downloading https://repo1.maven.org/maven2/commons-lang/commons-lang/2.6/commons-lang-2.6.jar ...
[ivy:retrieve] ............................. (277kB)
[ivy:retrieve] .. (0kB)
[ivy:retrieve] 	[SUCCESSFUL ] commons-lang#commons-lang;2.6!commons-lang.jar (1955ms)
[ivy:retrieve] downloading /ivy/chained-resolvers/settings/repository/test-1.0.jar ...
[ivy:retrieve] .. (1kB)
[ivy:retrieve] 	[SUCCESSFUL ] org.apache#test;1.0!test.jar (4ms)
[ivy:retrieve] :: resolution report :: resolve 8197ms :: artifacts dl 1963ms
	---------------------------------------------------------------------
	|                  |            modules            ||   artifacts   |
	|       conf       | number| search|dwnlded|evicted|| number|dwnlded|
	---------------------------------------------------------------------
	|      default     |   2   |   2   |   1   |   0   ||   2   |   2   |
	---------------------------------------------------------------------
[ivy:retrieve] :: retrieving :: org.apache#chained-resolvers
[ivy:retrieve] 	confs: [default]
[ivy:retrieve] 	2 artifacts copied, 0 already retrieved (278kB/6ms)

run:
    [mkdir] Created dir: /ivy/chained-resolvers/chainedresolvers-project/build
    [javac] /ivy/chained-resolvers/chainedresolvers-project/build.xml:58: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
    [javac] Compiling 1 source file to /ivy/chained-resolvers/chainedresolvers-project/build
     [java] standard message :example world !
     [java] capitalized by org.apache.commons.lang.WordUtils : Example World !
     [java] upperCased by test.StringUtils : EXAMPLE WORLD !

BUILD SUCCESSFUL
Total time: 16 seconds
  • 我们可以在resolve任务的日志中看到,这两个依赖项已被检索(2个工件)并复制到Ivy缓存目录(2个已下载)。
  • 还要注意,run Ant target成功地使用了两个jar,commons-lang.jar(来自ibiblio存储库)和test.jar(来自本地存储库)。

三、Going further

这个非常简单的示例帮助我们了解如何在一个链中设置两个解析器。链解析器的参考文档可供那些谁想知道所有的功能提供了这个解析器。

下面是一些更有趣的事情值得了解链解析器。看完后,继续用你的新知识来调整这个例子!

  • 一个链不限于两个嵌套的解析器,您可以使用任意数量的解析器
  • 通过设置returnFirst=“true”,您可以拥有一个链,该链在找到给定模块的结果后立即停止
  • 通过设置dual=“true”,完整链将同时用于模块描述符和工件,而设置dual=“false”,链中找到模块描述符(如果有的话)的解析器也将用于工件
 类似资料: