为什么我应该包含一个 gradle 依赖项作为 `@aar`
Why should I include a gradle dependency as `@aar`
为什么我应该(或不应该)包含 gradle 依赖项作为 @aar
、
benefits/drawbacks如果有的话是什么?
如您所见,我将@aar 添加到下面支持它的库中。但是在这样做之前一切似乎都有效......
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.1.1'
compile 'com.google.android.gms:play-services-maps:7.3.+'
compile 'com.google.guava:guava:18.0'
compile 'com.octo.android.robospice:robospice-spring-android:1.4.14'
compile 'org.codehaus.jackson:jackson-mapper-asl:1.9.13'
compile 'com.mcxiaoke.volley:library-aar:1.0.0@aar'
compile 'de.psdev.licensesdialog:licensesdialog:1.7.0@aar'
}
TL;DR:忽略 @
后缀,即使不是所有时间,大多数时候你都会很好。
以此为开场白,这是我对正在发生的事情的理解...
@
语法表明您需要这种类型的工件,对于可能有多个工件的情况 ID/artifact ID 与情况相关。
例如,一个 Android 库项目自然会编译成一个 AAR,因此这将是要分发的典型工件。然而,如果库项目实际上没有使用资源,它也可以被编译成一个 JAR,因此可以在 AAR 不可用的情况下使用。库作者可以将 AAR 和 JAR 作为单独的工件类型分发给同一组 ID/artifact ID,因此工具可以抓取任何合适的。您不提供@
后缀的工具将选择一个,但如果您提供后缀,该工具应遵守您的要求。
在 Android Studio 的情况下,我的理解是它会首先查找 AAR 工件,然后是 JAR,如果您没有另外指定的话。我的理解是 Android 的 Maven 会做相反的事情,先寻找 JAR,然后再寻找 AAR。
因此,如果有一个库的默认工件分辨率不符合您的喜好,您可以添加 @
后缀并将分辨率强制为您想要的分辨率。但是,通常情况下,即使没有它,该工具也会做正确的事情。
如果您要求的东西不存在,那么带有 @
后缀的地方就会出现问题。例如,compile 'com.android.support:appcompat-v7:22.1.1@jar'
将不起作用,因为该工件仅作为 AAR 可用——当它尝试下载依赖项时应该会失败。
库可以多种格式上传,大多数时候您将使用 .jar
或 .aar
。
当您不指定 @
后缀时,您将以默认格式(由其作者定义,否则 .jar
)及其所有依赖项下载库.
compile 'com.android.support:appcompat-v7:22.1.1'
当您指定 @
后缀时,您会强制以您指定的格式(可能存在也可能不存在)下载库。这很有用,例如当作者忘记指定库是 .aar
并且 maven(或 gradle,不确定)默认将其视为 .jar
。当指定 @
后缀时,不再下载此库的依赖项,因此您必须手动确保。
compile 'com.android.support:appcompat-v7:22.1.1@aar'
compile 'com.android.support:support-v4:22.1.1@jar'
为确保在指定 @
后缀时下载库的完整依赖关系树,您必须按以下方式编写:
compile ('com.android.support:appcompat-v7:22.1.1@aar') {
transitive = true
}
为什么我应该(或不应该)包含 gradle 依赖项作为 @aar
、
benefits/drawbacks如果有的话是什么?
如您所见,我将@aar 添加到下面支持它的库中。但是在这样做之前一切似乎都有效......
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.1.1'
compile 'com.google.android.gms:play-services-maps:7.3.+'
compile 'com.google.guava:guava:18.0'
compile 'com.octo.android.robospice:robospice-spring-android:1.4.14'
compile 'org.codehaus.jackson:jackson-mapper-asl:1.9.13'
compile 'com.mcxiaoke.volley:library-aar:1.0.0@aar'
compile 'de.psdev.licensesdialog:licensesdialog:1.7.0@aar'
}
TL;DR:忽略 @
后缀,即使不是所有时间,大多数时候你都会很好。
以此为开场白,这是我对正在发生的事情的理解...
@
语法表明您需要这种类型的工件,对于可能有多个工件的情况 ID/artifact ID 与情况相关。
例如,一个 Android 库项目自然会编译成一个 AAR,因此这将是要分发的典型工件。然而,如果库项目实际上没有使用资源,它也可以被编译成一个 JAR,因此可以在 AAR 不可用的情况下使用。库作者可以将 AAR 和 JAR 作为单独的工件类型分发给同一组 ID/artifact ID,因此工具可以抓取任何合适的。您不提供@
后缀的工具将选择一个,但如果您提供后缀,该工具应遵守您的要求。
在 Android Studio 的情况下,我的理解是它会首先查找 AAR 工件,然后是 JAR,如果您没有另外指定的话。我的理解是 Android 的 Maven 会做相反的事情,先寻找 JAR,然后再寻找 AAR。
因此,如果有一个库的默认工件分辨率不符合您的喜好,您可以添加 @
后缀并将分辨率强制为您想要的分辨率。但是,通常情况下,即使没有它,该工具也会做正确的事情。
如果您要求的东西不存在,那么带有 @
后缀的地方就会出现问题。例如,compile 'com.android.support:appcompat-v7:22.1.1@jar'
将不起作用,因为该工件仅作为 AAR 可用——当它尝试下载依赖项时应该会失败。
库可以多种格式上传,大多数时候您将使用 .jar
或 .aar
。
当您不指定 @
后缀时,您将以默认格式(由其作者定义,否则 .jar
)及其所有依赖项下载库.
compile 'com.android.support:appcompat-v7:22.1.1'
当您指定 @
后缀时,您会强制以您指定的格式(可能存在也可能不存在)下载库。这很有用,例如当作者忘记指定库是 .aar
并且 maven(或 gradle,不确定)默认将其视为 .jar
。当指定 @
后缀时,不再下载此库的依赖项,因此您必须手动确保。
compile 'com.android.support:appcompat-v7:22.1.1@aar'
compile 'com.android.support:support-v4:22.1.1@jar'
为确保在指定 @
后缀时下载库的完整依赖关系树,您必须按以下方式编写:
compile ('com.android.support:appcompat-v7:22.1.1@aar') {
transitive = true
}