ant - Apache Ivy : resolving dependencies embedded in an installer

标签 ant build build-automation dependencies ivy

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

问题:

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

要求:

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

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

或者也许我以错误的方式处理这个问题?从我迄今为止在网络上发现的情况来看,人们似乎只是使用 Ivy 下载文件并在事后手动(使用 Ant/其他方式)对它们进行后处理,而不是实际解决更复杂的>Ivy 内的依赖关系

谢谢

PS:我不在乎安装程序是否也放入ivy下载缓存中,但我只想下载一次安装程序(而不是同时下载两个依赖项)。 p>

最佳答案

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

我不喜欢这个有两个原因

  1. ivy.xml 应该只声明您的依赖项,而不是它们的位置。
  2. 需要在 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,另一个是配置为在本地查找指令的打包器。 (另请参阅 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>

神奇之处在于“packager”文件中。在解析时,这将用于生成 ANT 脚本,该脚本下载并提取所需的 jar。 (无需将此逻辑放入您的 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。这似乎是可选的,除非您想声明它的许可证和其他应该存在于公共(public)存储库中的属性。

关于ant - Apache Ivy : resolving dependencies embedded in an installer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/908371/

相关文章:

android - 无法使用 Ant 从外部 jar 构建多个 Android dex 文件

ant - 如何从 Ant 中的批处理文件中获取 %ERRORLEVEL%

svn - 从颠覆标签自动构建

ant - 如何运行 Ant 构建文件中的所有目标?

.net - 我可以让 .net 编译器进行一些乐观缓存以加快构建速度,而无需将代码库重构为程序集吗?

java - Maven 找不到本地依赖项

c++ - 为多个移动平台构建工具

msbuild - 在 MSBuild 中获取 NuGet 包文件夹

deployment - 自动部署资源

java - 自定义 Ant 构建和 JavaFX