我有一个库项目(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'])
}
答案 0 :(得分:3)
有没有办法让gradle捆绑所有依赖类 输出aar文件?
是的,有办法做到这一点,我之前遇到过这个问题。但这将是一个漫长的故事,请耐心等待。
在build.gradle中指定依赖项时,您要告诉Gradle从Maven存储库下载工件(AAR / JAR)。所以,Gradle需要两件事:
您可以在顶级build.gradle
repositories {
jcenter()
google()
}
并指定项目级build.gradle
dependencies {
compile 'com.example:mylibrary:1.0.1'
}
Gradle / Maven如何知道mylibrary
需要其他依赖项?来自您的依赖POM file。
让我们使用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
。
回到你的问题,如何&#34;结合&#34;你的图书馆项目是单一的.aar?以下是步骤:
您的依赖关系很可能已经存在于mvnrepository中,如果它不存在,您可以在bintray,mvnrepository上提交依赖关系,或托管您自己的Maven存储库。
就像在OkHttp依赖项块中一样,您将库依赖项放在那里。
您可以使用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 :(得分:0)
您不能尝试做什么 - 至少不可能按照上述方式进行。