调用“ivy:retrieve”的问题在于,您还需要在ivy.xml(包含 URL)中添加一个“artifact”标签,以便检索在 Maven 存储库中找不到的依赖项......
我不喜欢这个有两个原因
- ivy.xml应该只声明您的依赖项,而不是它们的位置。
- 需要build.xml中的附加自定义逻辑来处理 3rd 方包
理想情况下,应该由您的存储库设置来决定如何下载各种 jar,这就是我喜欢打包解析器的原因。即使我想要的库不在 Maven 中,我也可以配置 ivy 来处理它。
以下是将jreleaseinfo项目转为 ivy 依赖项的示例(托管在 sourceforge 中,我在 Maven 中找不到)
常春藤.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<ivy-module version="2.0">
<info organisation="com.myspotontheweb" module="ivy_packager"/>
<dependencies>
<dependency org="ch.oscg" name="jreleaseinfo" rev="1.3.0"/>
</dependencies>
</ivy-module>
声明两个解析器。默认是 Maven2,另一个是配置为在本地查找指令的打包程序。(另见常春藤综述项目)
常春藤设置.xml
<ivysettings>
<settings defaultResolver="maven2"/>
<resolvers>
<ibiblio name="maven2" m2compatible="true"/>
<packager name="repackage" buildRoot="${user.home}/.ivy2/packager/build" resourceCache="${user.home}/.ivy2/packager/cache">
<ivy pattern="file:///${basedir}/repository/[organisation]/[module]/[revision]/ivy.xml"/>
<artifact pattern="file:///${basedir}/repository/[organisation]/[module]/[revision]/packager.xml"/>
</packager>
</resolvers>
<modules>
<module organisation="ch.oscg" name="jreleaseinfo" resolver="repackage"/>
</modules>
</ivysettings>
魔术包含在“打包程序”文件中。在解析时,这将用于生成下载和提取所需 jar 的 ANT 脚本。(无需将此逻辑放入您的build.xml)
存储库/ch.oscg/jreleaseinfo/1.3.0/packager.xml
<packager-module version="1.0">
<property name="name" value="${ivy.packager.module}"/>
<property name="version" value="${ivy.packager.revision}"/>
<property name="zipname" value="${name}-${version}"/>
<resource dest="archive" url="http://sourceforge.net/projects/jreleaseinfo/files/jreleaseinfo/jreleaseinfo%201.3.0/jreleaseinfo-1.3.0.zip/download" sha1="9386d92758e627d04c2480b820731fd538b13a3f" type="zip"/>
<build>
<move file="archive/${zipname}/${zipname}.jar" tofile="artifacts/jars/${name}.jar"/>
</build>
</packager-module>
为了减少文件的数量,我省略了模块的ivy.xml。这似乎是可选的,除非您想声明它的许可证和其他应该存在于公共存储库中的属性。