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

Her*_*ron 4 ant build-automation dependencies build ivy

我有一个构建问题,我必须通过Apache Ivy解决非标准工件.

问题:

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

要求:

  • 我必须在构建期间解析/下载工件(我无法使用我的代码保留安装程序或提取的工件).
  • 我无法使用存储库来存储提取的工件.
  • Subclassing/Extending Ivy /无论如何都很好.

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

或者我可能以错误的方式接近问题?从我到目前为止在网上发现的情况来看,人们似乎只是使用Ivy来下载文件并在事后对其进行手动后处理(使用Ant /其他),而不是实际解决Ivy中更复杂的依赖关系.

谢谢

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

Mar*_*nor 5

调用"ivy:retrieve"的问题是你需要在ivy.xml中添加一个"artifact"标签(带有URL),以便检索Maven资源库中找不到的依赖项...

我不喜欢这个有两个原因

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

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

以下是将jreleaseinfo项目转换为常春藤依赖项的示例(托管在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>
Run Code Online (Sandbox Code Playgroud)

宣布两个解析器.默认值是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>
Run Code Online (Sandbox Code Playgroud)

魔术包含在"packager"文件中.在解决时,这将用于生成ANT脚本,该脚本既下载又提取所需的jar.(无需将此逻辑放入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>
Run Code Online (Sandbox Code Playgroud)

为了减少文件数量,我省略了模块的ivy.xml.这似乎是可选的,除非您要声明它的许可证以及应该存在于公共存储库中的其他属性.