本教程是一个如何由多个解析器检索模块的示例。在许多情况下,使用多个解析器可能很有用。例如:
项目非常简单,只包含一个简单类: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)
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存储库中查找以检索工件
就这样,我们刚刚配置了一个解析器链!
[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
这个非常简单的示例帮助我们了解如何在一个链中设置两个解析器。链解析器的参考文档可供那些谁想知道所有的功能提供了这个解析器。
下面是一些更有趣的事情值得了解链解析器。看完后,继续用你的新知识来调整这个例子!
- 一个链不限于两个嵌套的解析器,您可以使用任意数量的解析器
- 通过设置returnFirst=“true”,您可以拥有一个链,该链在找到给定模块的结果后立即停止
- 通过设置dual=“true”,完整链将同时用于模块描述符和工件,而设置dual=“false”,链中找到模块描述符(如果有的话)的解析器也将用于工件