android studio生成依赖的aar

时间:2014-09-24 15:10:22

标签: android gradle android-studio

我有一个库项目(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'])
}

2 个答案:

答案 0 :(得分:3)

  

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

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

背景

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

  1. Maven存储库位置
  2. 依赖本身
  3. 您可以在顶级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 Artifact

    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

    您的图书馆计划

    回到你的问题,如何&#34;结合&#34;你的图书馆项目是单一的.aar?以下是步骤:

    1. 将您的依赖项(您的JAR或AAR)发布到Maven存储库。
    2. 您的依赖关系很可能已经存在于mvnrepository中,如果它不存在,您可以在bintray,mvnrepository上提交依赖关系,或托管您自己的Maven存储库。

      1. 为您创建一个POM文件AAR。
      2. 就像在OkHttp依赖项块中一样,您将库依赖项放在那里。

        1. 将您的图书馆AAR提交给Maven资料库。
        2. 您可以使用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步,您可以猜到,&#34;有一个gradle插件!&#34;。该插件为android-maven-publish,可归功于:wupdigital,以简化这些过程。

          现在您可以使用gradle命令发布您的库:

          gradle yourlibrary:assembleRelease yourlibrary:publishMavenReleaseAarPublicationToMavenRepository
          

          如何共享您的图书馆计划

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

          1. 包含您的库及其依赖项的Maven存储库
          2. 您的图书馆组,工件和版本名称
          3. 那就是它!无需将依赖项依赖性提供给同行。

            干杯

答案 1 :(得分:0)

您不能尝试做什么 - 至少不可能按照上述方式进行。