如何使用 Ivy 发布本机库?

Posted

技术标签:

【中文标题】如何使用 Ivy 发布本机库?【英文标题】:How to publish native libraries with Ivy? 【发布时间】:2014-01-31 21:33:02 【问题描述】:

对于 Java 库项目,要发布的工件很简单,因为输出是单个 jar 文件。但是,我还有一个项目要发布以下内容:

MyLib.jar armeabi/libStuff.so armeabi-v7a/libStuff.so mips/libStuff.so x86/libStuff.so

我无法将所有这些 .so 文件设置为工件,因为它们都具有相同的名称。推荐的方式是什么?将所有内容放在一个 zip 中,让用户在构建之前使用 gradle(或 ant 或其他)解压缩它?我应该把 Jar 文件放在 zip 之外吗?此类工件是否有约定?

【问题讨论】:

【参考方案1】:

使用 Ivy 管理许多“相同”工件(唯一不同的是架构)的最佳方式是使用 extra attributes。

所以在你的模块中你要声明:

<publications xmlns:e="http://ant.apache.org/ivy/extra">
    <artifact name="MyLib" type="jar" ext="jar" />
    <artifact name="libStuff" type="native" ext="so" e:arch="armeabi" />
    <artifact name="libStuff" type="native" ext="so" e:arch="armeabi-v7a" />
    <artifact name="libStuff" type="native" ext="so" e:arch="mips" />
    <artifact name="libStuff" type="native" ext="so" e:arch="x86" />
</publications>

缺点是您围绕 Ivy 的整个链条都必须考虑该额外属性。例如,您应该能够配置您的存储库,使其接受像这样的自定义模式:

$repository.dir/[organisation]/[module]/[arch]/[revision]/[artifact].[ext]

正如您所提到的,另一种解决方案是使用 zip 文件夹。这可能是一个很好的时机,因为即将发布的 Ivy 2.4 通过packaging 支持压缩文件夹。

例如,您可以声明:

<publications xmlns:e="http://ant.apache.org/ivy/extra">
    <artifact name="MyLib" type="jar" ext="jar" />
    <artifact name="libStuff" type="natives" ext="zip" packaging="zip" />
</publications>

然后,Ivy 会将libStuff-1.2.3.zip 下载到它的缓存中,并会自动将其解压缩到缓存中的libStuff-1.2.3 文件夹中,您可以在其中找到您的多个本地库。

【讨论】:

非常感谢!实际上,我们正在尝试使用我们所有项目(java、c#、c、c++...)的工件来填充 Nexus 服务器,并且在某些项目中我们确实需要保留目录层次结构。因此,Ivy 的“打包”功能看起来真的很有趣!

以上是关于如何使用 Ivy 发布本机库?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Ivy 进行多伪影分辨率

如何使用自定义 gradle 插件而不将其发布到 maven/ivy 存储库?

Maven 范围如何通过 ivy 映射到 ivy 配置

我不知道如何使用 Apache Ivy

如何使用 Sonatype Nexus 作为 Ivy 依赖项的镜像 [重复]

如何附加使用 ivy 下载的库的源代码