如何将Android库发布到Maven存储库以方便使用?

时间:2019-02-18 05:10:12

标签: android maven aar

我使用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>

3 个答案:

答案 0 :(得分:1)

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

Jitpack允许您非常轻松地发布您的库以直接从Github进行发行。

虽然此答案不能直接回答您的问题,但确实提供了有效且更简单的选择。

答案 1 :(得分:0)

我遇到了完全相同的问题!并问了同样的问题,您可以看到我的问题here。我的问题是答案中的解释,而分享给我的帖子不够清楚(或者我可能无法正确理解它们)……但是!然后我发现this super useful post得益于AndroidWeekly,我按照该帖子中的步骤进行操作,然后便可以将库发布到maven,您可以在here中检查我的库并将其添加到您的项目中使用这个:

implementation 'com.codesgood:justifiedtextview:1.1.0'

这就是您希望通过gradle使自己可用的方式。让我知道您是否需要一些帮助来完成该帖子的步骤,我们将很乐意为您提供帮助

答案 2 :(得分:0)

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

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

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

现在,如果要使用gradle创建库,则需要了解gradle如何打包依赖项。有两种方法:

实现:通过使用此词,依赖项将保留在库的路径中。它不会暴露给消费者的道路。因此,如果需要找到库的依赖项,则使用者项目将失败。例如,如果您要返回RxAndroid可观察对象,则编译将失败,因为编译器将无法找到返回的方法签名中提到的RxAndroid类。另一方面,如果该库的依赖项仅在内部使用(例如,您使用改造功能构建一个rest模块,并且在返回签名中仅公开RxJava),则可以进行编译。

api:与实现完全相反。标记为api的依赖项将渗入使用者的路径,因此,每次公开一个依赖项时都必须使用它。使用与之前相同的示例,您应该使用api导入RxAndroid,并通过实现进行改进。这样一来,您无需使用任何额外的导入或标志即可使用该库。

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