java - 如何使用ivy发布原生库?

标签 java gradle native ivy

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

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

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

最佳答案

使用 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 - 如何使用ivy发布原生库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21086191/

相关文章:

java - "AWT widgets written in Java which delegated to peer classes that were written in C"是什么意思?

java - View 中的 OnTouchListener - Android

Java 多线程 - 本地对象引用是否共享?

java - 在RequestPermissionsResult 上再次请求位置权限

gradle - Android Studio : Plugin with id 'android-library' not found

android - 所有 com.android.support 库必须使用完全相同的版本规范

gradle - 使用 gradle 回滚 liquibase

java - NumberFormat 解析货币值失败

ios - 为什么同域政策不影响 native 移动应用程序?

java - 从 Java VM 获取 native 字大小