【问题标题】:How to publish an Android library to a Maven repository to be used easily?如何将 Android 库发布到 Maven 存储库以便轻松使用?
【发布时间】:2019-07-11 10:54:12
【问题描述】:

我使用 this 指南将我的 Android 库(带有依赖项)发布到 AWS S3 maven 存储库。

在一个新项目中,我将S3存储桶添加为一个Maven仓库,如果在新项目的build.gradle文件中添加以下内容就可以成功使用:

implementation ('com.mydomain:my_library:1.4:release@aar') {
    transitive=true
}

(“transitive=true”是必需的,以便包含库的依赖项。)

但是,我希望其他人能够使用它的简化版本,就像我看到的许多其他库一样:

implementation 'com.mydomain:my_library:1.4'

当我这样做时,在代码中出现“无法解析符号”错误,并且(当然)在尝试构建我的项目时出现“不存在”错误。

我的库的 POM 文件如下所示。有什么我可以改变的,所以我可以使用上面的“简化”实现行,或者我还能做些什么吗?

注意:我尝试将“pom”替换为“aar”,使缓存无效,然后再次运行,但行为相同。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mydomain</groupId>
  <artifactId>my_library</artifactId>
  <version>1.4</version>
  <packaging>pom</packaging>
  <dependencies>
    <dependency>
      <groupId>com.android.support</groupId>
      <artifactId>appcompat-v7</artifactId>
      <version>27.1.1</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.android.support.constraint</groupId>
      <artifactId>constraint-layout</artifactId>
      <version>1.1.3</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.android.support</groupId>
      <artifactId>design</artifactId>
      <version>27.1.1</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>io.reactivex.rxjava2</groupId>
      <artifactId>rxandroid</artifactId>
      <version>2.1.0</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>io.reactivex.rxjava2</groupId>
      <artifactId>rxjava</artifactId>
      <version>2.2.4</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.github.instacart.truetime-android</groupId>
      <artifactId>library-extension-rx</artifactId>
      <version>3.3</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.google.dagger</groupId>
      <artifactId>dagger-android</artifactId>
      <version>2.15</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.nostra13.universalimageloader</groupId>
      <artifactId>universal-image-loader</artifactId>
      <version>1.9.5</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.google.firebase</groupId>
      <artifactId>firebase-core</artifactId>
      <version>16.0.6</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.google.firebase</groupId>
      <artifactId>firebase-messaging</artifactId>
      <version>17.3.4</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
</project>

【问题讨论】:

    标签: android maven aar


    【解决方案1】:

    如果您的项目恰好托管在 Github 上,请考虑改用 https://jitpack.io/

    Jitpack 让您可以非常轻松地直接从 Github 发布库以进行 gradle。

    虽然此答案不能直接回答您的问题,但它确实提供了一个有效且更简单的替代方案。

    【讨论】:

    • 谢谢,兄弟,我花了一天时间尝试使用 bintray
    【解决方案2】:

    我遇到了完全相同的问题!并问了同样的问题,你可以看到我的问题here。我的问题是答案中的解释和分享给我的帖子不够清楚(或者我可能无法正确理解它们)......但是!然后我发现 this super useful post 感谢 AndroidWeekly,我按照那篇文章中的步骤操作,然后我能够将我的库发布到 maven,您可以在 here 中查看我的库?您可以使用以下方法将其添加到您的项目中:

    implementation 'com.codesgood:justifiedtextview:1.1.0'
    

    正是您希望通过 gradle 提供的方式。如果您在完成该帖子的步骤时需要一些帮助,请告诉我,我很乐意为您提供帮助 ?

    【讨论】:

    • 谢谢。我之前看过那篇文章,但不幸的是,它没有涉及使用 AWS S3 存储库,也没有解释在尝试使用该库时如何消除“release”、“@aar”或“transitive=true”。但是,它确实链接到另一个关于使用 S3 存储库的教程,我将查看该教程。如果您知道如何摆脱这些元素(POM 文件更改?)我会非常感兴趣!
    • ?我一直在阅读一些博客和其他问题,似乎@aar 符号关闭了传递标志,因为这意味着您只想下载 aar 工件,而不是依赖项.. . 检查this answer。所以如果你可以删除“@aar”符号,你应该很高兴✌?
    • 但似乎删除 @aar 正是您正在努力解决的问题...给我几分钟,我会将您的 POM 与我用来上传库的 POM 进行比较,也许我可以找到一些重要的区别。
    • 似乎唯一的区别是包装?我使用“aar”而不是“pom”,其余部分几乎相同,但由于我的库的简单性(这只是一个证明合理的观点其中包含的文本)我不需要任何外部依赖项......所以也许这就是我没有找到你看到的问题的原因?
    • 是的,在 POM 文件中更改为 aar 似乎没有帮助。谢谢。
    【解决方案3】:

    如果你是使用 maven 构建库,你需要添加 maven android 插件。这样您就可以将其打包为 AAR 文件。在这种情况下,根据我的经验,编译范围不会将库的依赖项传播到路径中,您仍然需要添加 transitive=true 标志。

    插件网站:https://simpligility.github.io/android-maven-plugin/plugin-info.html

    示例 POM:https://github.com/fcopardo/EasyRest/blob/master/pom.xml

    现在,如果你使用 gradle 创建库,你需要了解 gradle 是如何打包依赖的。有两种方式:

    implementation:通过使用这个词,依赖关系被保存在库的路径中。它不会暴露在消费者的路径中。因此,如果需要定位库的依赖项,消费者项目将失败。例如,如果您要返回 RxAndroid observables,编译将失败,因为编译器将无法找到返回的方法签名中提到的 RxAndroid 类。另一方面,如果库的依赖仅在内部使用(例如,您使用改造构建了一个 rest 模块并在返回签名中仅公开 RxJava),则可以进行编译。

    api: 与实现完全相反。标记为 api 的依赖项将潜入消费者的路径,因此,每次公开您的依赖项之一时都必须使用它。使用与之前相同的示例,您应该使用 api 导入 RxAndroid,并使用实现进行改造。这应该允许您在没有任何额外导入或标志的情况下使用该库。

    请记住,maven android 插件从版本 4 开始支持 gradle 项目的格式,因此您可以同时拥有 POM 文件和 .gradle 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-26
      • 1970-01-01
      • 2022-01-28
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多