前言
在编写Android程序时,我们经常使用 @NonNull
,@UiThread
,@IntegerRes
等等这些Android提供的注解:support-annotations。
你可能在Android上使用的很爽,但是当你想在一个 Java Library中使用 support-annotations 时,你却发现 gradle
一直弹出 :
Failed to resolve: com.android.support:support-annotations:xx.xx.xx
提示无法解析 support-annotations 这个库,这个原因是因为 google 并没有将 support-annotations 库发布到 jcenter 这类代码仓库中,所以在 jcenter 就无法找到相应的 jar/aar 文件,也就有了上面的错误提示。而Android工程可以使用 support-annotations 的原因是因为 android 插件提供了相应功能去包含这些 support-annotations 依赖,而 java 插件却没有提供。
解决方法
上面说了那么多,那究竟要通过怎样的方式让我们能在 Java Library 中使用 support-annotations 呢,主要有下面3种方法:
- 下载 jar 包,手动进行依赖。
既然我们无法从jcenter中找到 support-annotations 这个库,那我们就手动下载它的 jar 包,然后 gradle 引入就行啦。而 support-annotations 是默认在我们通过 sdk-manager 下载时就已经包含的了,路径就在我们的本地:
<your-SDK-path>/extras/android/support/annotations/android-support-annotations.jar
- 使用本地 maven 仓库。
因为上面我们知道,support-annotations 已经早就被我们下载到我们的电脑上了,那么我们直接通过本地 maven 的方式引入,gradle 就可以找到了:
allprojects {
repositories {
jcenter()
maven { url uri('<your-SDK-path>/extras/android/m2repository/') }
}
}
//java library: build.gralde
compile 'com.android.support:support-annotations:26.0.0-alpha1'
- 代码引入(推荐)
我们从第二种方法知道,解决的一种方法就是直接通过添加本地 maven 仓库,而对于不同的电脑,各自的sdk路径是不同的,所以方法2中的强编码适用性不强,而通过代码的方式,就可以实现动态解析得到各个电脑本地的sdk路径,从而直接添加 maven 本地仓库:
def logger = new com.android.build.gradle.internal.LoggerWrapper(project.logger)
def sdkHandler = new com.android.build.gradle.internal.SdkHandler(project, logger)
for (File file : sdkHandler.sdkLoader.repositories) {
repositories.maven {
url = file.toURI()
}
}
//java library: build.gralde
compile 'com.android.support:support-annotations:26.0.0-alpha1'
你们可以对url进行打印一下,你就会发现其实上面这段代码就是添加了3个 maven 本地仓库:
repositories {
maven { url uri('<your-SDK-path>/extras/android/m2repository/') }
maven { url uri('<your-SDK-path>/extras/google/m2repository/') }
maven { url uri('<your-SDK-path>/extras/m2repository/') }
}