【问题标题】:android studio generate aar with dependencyandroid studio生成具有依赖关系的aar
【发布时间】:2014-09-24 15:10:22
【问题描述】:

我有一个库项目(A),它引用了另一个jar文件(B.jar),但是在生成aar文件后,jar文件(B.jar)没有捆绑在输出aar文件中,当使用这个aar文件时,我收到了NoClassDefFoundError

有没有办法让 gradle 捆绑输出 aar 文件中的所有依赖类? 这是我的 build.gradle:

apply plugin: 'com.android.library'

repositories {
    mavenCentral()
}

android {

    buildTypes {
        release {
            runProguard true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.txt'
        }
    }
}

dependencies {
    compile project(':common')
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

【问题讨论】:

  • 库是在调试还是发布模式下构建的?稍后,您运行 ProGuard,这可以解释为什么在使用该库时会有 NoClassDefFoundError
  • @user2713030 debug和release都是一样的,只是没有打包依赖jar类

标签: android gradle android-studio


【解决方案1】:

有没有办法让 gradle 捆绑所有依赖类在 输出aar文件?

是的,有办法做到这一点,我以前遇到过这个问题。但这将是一个漫长的故事,请耐心等待。

背景

当您在 build.gradle 中指定依赖项时,您是在告诉 Gradle 从 Maven 存储库下载一个工件 (AAR / JAR)。所以,Gradle 需要两件事:

  1. Maven 存储库位置
  2. 依赖本身

您在顶级 build.gradle 中指定 Maven 存储库

repositories {
    jcenter()
    google()
}

并且你指定了对项目级build.gradle的依赖

dependencies {
    compile 'com.example:mylibrary:1.0.1'
}

Gradle / Maven 如何知道mylibrary 需要其他依赖项?来自您的依赖POM file

POM 示例

我们以 Square 的 OkHttp 为例,你可以在 mvnrepository.com 找到这个神器。

OkHttp 有一个 POM 文件。您可以单击该链接以显示完整的 XML,我只向您展示有趣的部分,即依赖项块。

<project>
   <modelVersion>4.0.0</modelVersion>
   <parent>...</parent>
   <artifactId>okhttp</artifactId>
   <name>OkHttp</name>
   <dependencies>
      <dependency>
         <groupId>com.squareup.okio</groupId>
         <artifactId>okio</artifactId>
      </dependency>
      <dependency>
         <groupId>com.google.android</groupId>
         <artifactId>android</artifactId>
         <scope>provided</scope>
      </dependency>
      <dependency>
         <groupId>com.google.code.findbugs</groupId>
         <artifactId>jsr305</artifactId>
         <scope>provided</scope>
      </dependency>
   </dependencies>
   <build>...</build>
</project>

OkHttp 需要来自其他工件的依赖项。 Okio、Android 和 jsr305。但是,当您在项目中包含 OkHttp 时,您不必在项目中包含 Okio、Android 和 jsr305。这是为什么?

因为 Gradle / Maven 会查看 POM 文件并为您下载依赖项。没有更多的NoClassDefFoundError

您的图书馆项目

回到您的问题,如何将您的库项目“组合”成单个 .aar?步骤如下:

  1. 将您的依赖项(您的 JAR 或 AAR)发布到 Maven 存储库中。

很有可能你的依赖项已经存在于 mvnrepository 上,如果它不存在,你可以在 bintray、mvnrepository 上提交你的依赖项,或者托管你自己的 Maven 存储库。

  1. 为您的 AAR 创建一个 POM 文件。

就像在 OkHttp 依赖项块中一样,您将库依赖项放在那里。

  1. 将您的库 AAR 提交到 Maven 存储库。

您可以使用mvndeploy 将您的库提交到 Maven 存储库。

mvn deploy:deploy-file \
    -DgroupId=com.example \
    -DartifactId=your-library \
    -Dversion=1.0.1 \
    -Dpackaging=aar \
    -Dfile=your-library.aar \
    -DpomFile=path-to-your-pom.xml \
    -DgeneratePom=true \
    -DupdateReleaseInfo=true \
    -Durl="https://mavenUserName:mavenPassword@nexus.example.com/repository/maven-releases/"

如果您不想手动执行第 2 步和第 3 步,您可以猜到,“有一个 gradle 插件!”。该插件是android-maven-publish,感谢:wupdigital 以使这些过程更容易。

现在你可以使用 gradle 命令来发布你的库了:

gradle yourlibrary:assembleRelease yourlibrary:publishMavenReleaseAarPublicationToMavenRepository

如何分享您的图书馆项目

下次你的队友要求你的图书馆时,你可以给他们两件事:

  1. 包含您的库及其依赖项的 Maven 存储库
  2. 您的库组、工件和版本名称

就是这样!无需将您的依赖项依赖项提供给您的同行。

干杯?

【讨论】:

  • 我认为没有办法,但也许你知道的比我多...是否可以用我的 .aar 添加本地依赖项(我的 libs 文件夹中的一个文件)?我的意思是,无需将文件上传到 Maven 或其他存储库...
【解决方案2】:

你试图做的事情是不可能的——至少按照你上面描述的方式是不可能的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-24
    • 1970-01-01
    • 2016-07-10
    • 2021-09-26
    • 1970-01-01
    • 2013-06-21
    • 2016-08-30
    • 2016-06-21
    相关资源
    最近更新 更多