4

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

问题:

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

要求:

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

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

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

谢谢

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

4

2 回答 2

5

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

我不喜欢这个有两个原因

  1. ivy.xml应该只声明您的依赖项,而不是它们的位置。
  2. 需要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。这似乎是可选的,除非您想声明它的许可证和其他应该存在于公共存储库中的属性。

于 2010-01-27T20:03:52.730 回答
-1

我认为这非常简单:'ivy:retrieve' a_installer,然后将 aj 和 a-lib 解压缩到你的 lib 目录(或任何你想要的地方)。这应该很容易与蚂蚁做?

我想知道是否有一些你没有提到的复杂情况阻止你这样做。

于 2009-11-12T06:57:15.870 回答