簡體   English   中英

android studio生成依賴的aar

[英]android studio generate aar with dependency

我有一個庫項目(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'])
}

有沒有辦法讓gradle捆綁輸出aar文件中的所有依賴類?

是的,有辦法做到這一點,我之前遇到過這個問題。 但這將是一個長篇故事,請耐心等待。

背景

在build.gradle中指定依賴項時,您告訴Gradle從Maven存儲庫下載工件(AAR / JAR)。 所以,Gradle需要兩件事:

  1. Maven存儲庫位置
  2. 依賴本身

您可以在頂級build.gradle指定Maven存儲庫

repositories {
    jcenter()
    google()
}

並指定項目級build.gradle的依賴build.gradle

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

Gradle / Maven如何知道mylibrary需要其他依賴? 從您的Dependency POM文件

POM示例

我們以Square的OkHttp為例,您可以在mvnrepository.com中找到這個工件。

OkHttp神器

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. 為您創建一個POM文件AAR。

就像在OkHttp依賴項塊中一樣,您將庫依賴項放在那里。

  1. 將您的Library 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. 您的庫組,工件和版本名稱

而已! 無需將依賴項依賴項提供給您的同行。

干杯🥂

你想要做的事情是不可能的 - 至少不可能像你上面描述的那樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM