【问题标题】:How to publish native libraries with Ivy?如何使用 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 之外吗?此类工件是否有约定?

【问题讨论】:

    标签: java gradle native ivy


    【解决方案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 的“打包”功能看起来真的很有趣!
    猜你喜欢
    • 2015-02-04
    • 2011-07-03
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 2012-01-29
    • 2012-12-22
    相关资源
    最近更新 更多