我的项目包括一些图书馆项目。库正在使用一些aar文件,其dependecny已在模块:gradle文件中定义。我在项目中包含这个库时遇到了问题。
如果我在app-> lib中保留重复的aar文件并在app-> gradle文件中定义它们的依赖关系,那么就没有问题。但它不应该是正确的方法。
请在下面找到错误:
配置项目':app'。
时出现问题Could not resolve all dependencies for configuration ':app:_qaDebugCompile'. Could not find :api-release:. Searched in the following locations:
https://jcenter.bintray.com//api-release//api-release-.pom
https://jcenter.bintray.com//api-release//api-release-.aar
file:/D:/sample/sample-android-app/app/libs/api-release-.aar
file:/D:/sample/sample-android-app/app/libs/api-release.aar
Required by:
sample-android-app:app:unspecified > sample-android-app:misnapworkflow:unspecified
请在下面找到项目结构:
sample
|-- app
|-- misnapworkflow
|
|-- lib
|-- api-release.aar
在app gradle文件中提到了以下项目
依赖项{compile project(':misnapworkflow')}
请在下面找到misnapworkflow gradle文件:
apply plugin: 'com.android.library'
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
minSdkVersion 10
targetSdkVersion 23
consumerProguardFiles 'proguard-rules.pro'
}
lintOptions {
abortOnError false
}
// Publish both debug and release libraries
publishNonDefault true
buildTypes {
debug {
debuggable true
jniDebuggable true
minifyEnabled false
shrinkResources false
testCoverageEnabled true
}
release {
signingConfig signingConfigs.debug
debuggable false
jniDebuggable false
minifyEnabled true
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
task grantPermissions(type: Exec, dependsOn: 'installDebugTest') {
logger.warn('Granting permissions...')
commandLine "adb shell pm grant com.miteksystems.misnap.misnapworkflow.test android.permission.WRITE_EXTERNAL_STORAGE".split(' ')
commandLine "adb shell pm grant com.miteksystems.misnap.misnapworkflow.test android.permission.CAMERA".split(' ')
logger.warn('Permissions granted.')
}
tasks.whenTaskAdded { task ->
if (task.name.startsWith('connected')
|| task.name.startsWith('create')) {
task.dependsOn grantPermissions
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:23.0.1'
// Add dependency for MiSnap external API
compile(name: 'api-release', ext: 'aar')
// Add dependency for MiSnap
compile(name: 'misnap-release', ext: 'aar') {
exclude module: 'appcompat-v7'
}
// Eventbus dependency
compile 'de.greenrobot:eventbus:2.4.0'
// Add OPTIONAL dependency for Manatee
compile(name: 'manatee-release', ext: 'aar')
compile(name: 'cardio-release', ext: 'aar')
}
repositories {
flatDir {
dirs 'libs'
}
}
答案 0 :(得分:20)
aar 文件不包含transitive依赖项,并且没有pom文件描述了使用的依赖项库。
这意味着,如果您使用flatDir
repo 导入aar文件,则还必须在项目中指定依赖项。
您应该使用 maven存储库(您必须在私人或公共maven仓库中发布库),您将不会遇到同样的问题。
在这种情况下,gradle使用pom文件下载依赖项,该文件将包含依赖项列表。
答案 1 :(得分:5)
对于Android studio
请按照以下步骤操作:
第1步:
导入.aar
档案--->新--->新模块---> (选择)导入.JAR / .AAR包--->下一步--->(选择.aar
文件然后完成)
现在导入现有项目。
第2步:
添加dependencies
档案--->项目结构---> (现在你将在底部的左侧获得模块列表。)---> (选择app
模块)--->选择依赖项选项卡--->点击(+)按钮--->选择模块依赖关系---> (选择你添加的模块)--->好的--->好的
注意:要添加依赖关系
您的build.gradle
看起来像
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.2.1'
compile 'com.android.support:design:23.2.1'
compile 'com.squareup.picasso:picasso:2.5.0'
compile project(':ScreenSharingSDK')
}
答案 2 :(得分:1)
就我而言,以下事情有效:
将.aar文件放在libs目录中(如果需要,创建),然后在build.gradle(app level)中添加以下代码:
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile(name:'your_arr_filename', ext:'aar')
}
答案 3 :(得分:0)
您需要包含jcenter存储库。在app level build.gradle中:
repositories {
jcenter()
}
dependencies {
compile 'com.package.youraarpackagename@aar'
}
这些依赖项与其他依赖项不同。
答案 4 :(得分:0)
如果我在app-> lib中保留重复的aar文件并在app-> gradle文件中定义它们的依赖关系,那么就没有问题。但它不应该是正确的方法。
你说得对,你的app
不应该在build.gradle
中定义你的AAR库依赖项。对于像OkHttp,Picasso或RxJava这样的第三方库来说,这是一种常见的做法。事实上,这些库有自己的依赖关系,就像你的AAR库一样。
那么,为什么OkHttp,Picasso或者RxJava不会要求你的应用程序包含它们的依赖项?因为他们已将其依赖项包含在POM file中。 POM文件包含AAR的配置文件,包括工件,组名,版本及其依赖项。
我们以OkHttp为例。 OkHttp及其依赖项存储在其他人的计算机中。转到mvnrepository.com并搜索OkHttp。
你会找到OkHttp及其POM文件。
<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>
当您在build.gradle()
中添加库时,Gradle将在顶级build.gradle
中的存储库中搜索该库。对于OkHttp,它存储在mavenCentral()
。
repositories {
google()
mavenCentral()
jcenter()
}
Gradle将自动下载依赖项,您无需在App项目中指定库依赖项。
但它不应该是正确的方法。
正确的方法是:
您可以使用本地Maven存储库,托管您自己的Maven存储库,或在Maven Central或Bintray上发布您的库。 inthecheesefactory有一个很好的教程。
部署AAR时,必须包含POM文件。它可以手动完成。
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/"
或使用android-maven-publish Gradle插件。
gradle yourlibrary:assembleRelease yourlibrary:publishMavenReleaseAarPublicationToMavenRepository
在应用级build.gradle
中添加图书馆的GAV。
dependencies{
implementation "com.example:yourlibrary:1.0.1"
}
您和您的同行现在应该可以使用yourlibrary
。
答案 5 :(得分:0)
莫妮卡·穆恩(Monika Moon)使我走上了正确的道路,但我的代表点不足以在上面进行内联注释。叹气
因此,2020年使用Android Studio 3.5.3构建的默认Android应用将通过“项目视图”具有以下项目结构:
--[yourAppName]
--[app]
--[gradle]
build.gradle <this is the TOP LEVEL one and NOT the one you normally mess with>
在顶层build.gradle文件中添加“ flatDir”项:
allprojects {
repositories {
google()
jcenter()
// needed so it picks up my aar files
flatDir {
dirs 'libs'
}
}
}
然后在上方显示的“ app”文件夹中。您将拥有以下两个关键资源:
-- [libs] folder where you should drop your aar files
build.gradle file that is the one you add your aar dependencies to.
默认项目构建将已经为您包含一个“ libs”包含,但是以防万一您的版本没有它,这就是您需要添加的内容:
dependencies {
implementation fileTree(dir: './libs', include: ['*.jar'])
implementation(name: 'fileNameBeforeExtension', ext:'aar')
这很干净而且可以按预期工作。
我使用的AAR文件是为内部硬件构建的内部自定义文件,永远不会在公共仓库中出现。