Apache Ivy:解决嵌入在安装程序中的依赖项

Posted

技术标签:

【中文标题】Apache Ivy:解决嵌入在安装程序中的依赖项【英文标题】:Apache Ivy: resolving dependencies embedded in an installer 【发布时间】:2010-10-28 20:18:20 【问题描述】:

我在构建时遇到问题,我必须通过 Apache Ivy 解决非标准工件。

问题:

我依赖于两个工件(a.jar 和 a-lib.jar)。 这两个依赖项仅作为单个安装程序 (a_installer.jar) 的一部分提供。 可以下载安装程序,但不能下载嵌入的工件本身。 可以操纵安装程序来解压所需的依赖项。

要求:

我必须在构建期间解析/下载工件(我无法将安装程序或提取的工件与我的代码一起保留)。 我无法使用存储库来存储提取的工件。 子类化/扩展 Ivy/一切都很好。

有没有人解决过类似的问题,或者分享一些有用的信息?

或者也许我以错误的方式处理问题?从我目前在网上发现的情况来看,人们似乎使用 Ivy 只是为了下载 文件 并在事后手动(使用 Ant/whatever)对它们进行后处理,而不是真正解决更复杂的问题 依赖关系在 Ivy 中。

谢谢

PS:我不关心安装程序是否也放入了常春藤下载缓存,但我只想下载一次安装程序(而不是两个依赖项)。 p>

【问题讨论】:

【参考方案1】:

我认为这非常简单:'ivy:retrieve' a_installer,然后将 a.j 和 a-lib 解压缩到您的 lib 目录(或任何您想要的位置)。这应该很容易用蚂蚁做吧?

我想知道是否有一些你没有提到的并发症阻止你这样做。

【讨论】:

【参考方案2】:

调用“ivy:retrieve”的问题在于,您还需要在 ivy.xml 中添加一个“artifact”标签(包含 URL),以便检索依赖项而不是在 Maven 存储库中找到...

我不喜欢这个有两个原因

    ivy.xml 应该只声明您的依赖项,而不是它们的位置。 build.xml 中需要额外的自定义逻辑来处理第 3 方包

理想情况下,应该由您的存储库设置决定如何下载各种 jar,这就是我喜欢 packager 解析器的原因。即使我想要的库不在 Maven 中,我也可以配置 ivy 来处理它。

以下是将jreleaseinfo项目转为ivy依赖的示例(托管在sourceforge,我在Maven中找不到)

ivy.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,另一个是配置为在本地查找指令的 packager。 (另见 Ivy Roundup 项目)

ivysettings.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

repository/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。这似乎是可选的,除非您想声明它的许可证和其他应该存在于公共存储库中的属性。

【讨论】:

IvyRoundup 是一个公共的打包程序仓库。但是打包程序正是要走的路。

以上是关于Apache Ivy:解决嵌入在安装程序中的依赖项的主要内容,如果未能解决你的问题,请参考以下文章

Apache Ivy 排除依赖项的标记

Apache Ant 和 Ivy:生成了错误的依赖项

如何解决模块 X 的多个工件被检索到 Apache Ivy 中的同一个文件?

Ivy 解决了 Oracle JDBC 依赖项,但不部署具有其他依赖项的 jar

我不知道如何使用 Apache Ivy

手动检索 Ivy 依赖项作为 sbt 中的本地非托管库