我已经调查了一段时间,可能在这里看到了与 aar 和传递依赖项相关的最流行的答案,但不知何故,我仍然不清楚如何使其工作。
所以:
我有带有给定 gradle 配置的安卓库:
apply plugin: 'android-library'
apply plugin: 'android-maven'
version = "1.0.0"
group = "com.somepackage"
buildscript {
repositories {
mavenCentral()
mavenLocal()
}
dependencies {
classpath 'com.github.dcendents:android-maven-plugin:1.0'
}
}
android {
compileSdkVersion 19
buildToolsVersion '19.0.3'
defaultConfig {
minSdkVersion 10
}
}
repositories {
maven { url 'http://www.bugsense.com/gradle/' }
}
dependencies {
provided 'com.google.android.gms:play-services:+'
provided 'com.android.support:appcompat-v7:+'
compile 'com.google.code.gson:gson:2.2.4'
compile 'com.bugsense.trace:bugsense:3.6'
compile 'commons-net:commons-net:3.3'
}
然后我正在使用gradle install
将其部署到本地 maven 存储库中。已部署库的 POM 文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sprezzat</groupId>
<artifactId>app</artifactId>
<version>1.0.0</version>
<packaging>aar</packaging>
<dependencies>
<dependency>
<groupId>com.bugsense.trace</groupId>
<artifactId>bugsense</artifactId>
<version>3.6</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.2.4</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
最后,使用上述库作为依赖项对我的 android 应用程序进行 gradle 配置:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.9.+'
}
}
apply plugin: 'android'
repositories {
mavenCentral()
mavenLocal()
}
android {
compileSdkVersion 15
buildToolsVersion "19.0.2"
defaultConfig {
minSdkVersion 10
targetSdkVersion 18
}
}
dependencies {
compile 'com.google.android.gms:play-services:+'
compile 'com.android.support:appcompat-v7:+'
compile 'com.somepackage:LIBRARY_NAME:1.0.0@aar'
}
在手机上部署应用程序后,我正在NoClassDefFoundError
属于编译我的 android 库依赖项的类。
使用 gradle dependencies
检查我的 android 应用程序依赖项:
apk - Classpath packaged with the compiled main classes.
+--- com.google.android.gms:play-services:+ -> 4.3.23
| --- com.android.support:support-v4:19.0.1 -> 19.1.0
+--- com.android.support:appcompat-v7:+ -> 19.1.0
| --- com.android.support:support-v4:19.1.0
--- com.somepackage:LIBRARY_NAME:1.0.0
根据上面的树,不会检测到所有传递依赖项。问题出在哪里,应该如何正确完成?
我已经通过为我的 aar 依赖项设置transitive
属性解决了我的问题:
compile ('com.somepackage:LIBRARY_NAME:1.0.0@aar'){
transitive=true
}
不应该使用"@aar",如果使用"@"变成"仅工件表示法",如果你想使用"@"并希望有依赖传递,你应该添加"transitive=true"
在本地使用 aar,试试这个:
compile(project(:your-library-name)) {
transitive=true
}
我遇到了类似的问题,觉得我可以分享解决问题的步骤。
在发布自己的aar
时无法使用传递依赖项的基本思想实际上是没有使用预期的传递依赖项生成.pom
文件。
我正在使用'maven-publish'
插件作为我的 android aar
依赖项,以将其发布到我自己的私人 maven 存储库中。当我的其他项目在其build.gradle
中添加我的aar
依赖项时,传递依赖项未解决。因此,我在发布aar
时做了什么来修改.pom
文件。
这里需要注意的重要一点是,您希望具有传递行为的依赖项应使用库项目的build.gradle
文件中的api
导入,如下所示。
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
api 'com.android.volley:volley:1.0.0'
api "com.google.code.gson:gson:$globalGsonVersion"
}
现在,正如我之前所说,我正在使用maven-publish
插件来发布aar
依赖项,因此我在 gradle 中的发布任务如下所示。
publishing {
publications {
mavenAar(MavenPublication) {
from components.android
}
mavenJava(MavenPublication) {
pom.withXml {
def dependenciesNode = asNode().appendNode('dependencies')
// Iterate over the api dependencies (we don't want the test ones), adding a <dependency> node for each
configurations.api.allDependencies.each {
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', it.group)
dependencyNode.appendNode('artifactId', it.name)
dependencyNode.appendNode('version', it.version)
}
}
}
}
repositories {
maven {
// Your repository information goes here
}
}
}
因此,我使用另一个mavenJava
任务在我的私有 maven 存储库中发布.pom
文件,以便在将aar
文件作为依赖项添加到其他模块时,它会获取.pom
信息并下载传递依赖项。
要完成答案,您应该如何在build.gradle
文件中添加依赖项,以便您自己发布aar
导入我。
api('com.example.masudias:my_lib:1.0.0@aar') {
transitive = true
}
传递依赖
transitive
意味着消费者(例如.app)包括生产者和所有生产者的依赖项(例如库)。它增加了构建时间,并可能给依赖项版本带来一些问题
默认情况下,Gradle 依赖项具有transitive = true
api ('com.package:library:0.0.1')
//the same
api ('com.package:library:0.0.1') {
transitive = true
}
当您使用@artifact notation
时,它具有transitive = false
api ('com.package:library:0.0.1@aar')
//the same
api ('com.package:library:0.0.1@aar') {
transitive = false
}
对我来说,完整的发布解决方案如下所示:
apply plugin: 'com.github.dcendents.android-maven'
group = GROUP
version = VERSION
// you could move it to env variable or property
def publishFlavorless = true
def firstTask = null
android.libraryVariants.all { variant ->
if (variant.name.toLowerCase().contains("debug")) {
// Workaround for https://github.com/gradle/gradle/issues/1487
if (publishFlavorless && firstTask == null) {
def bundleTask = tasks["bundle${variant.name.capitalize()}Aar"]
firstTask = bundleTask
artifacts {
archives(firstTask.archivePath) {
builtBy firstTask
name = project.name
}
}
}
return
}
def bundleTask = tasks["bundle${variant.name.capitalize()}Aar"]
artifacts {
archives(bundleTask.archivePath) {
classifier variant.flavorName
builtBy bundleTask
name = project.name
}
}
}
install {
repositories.mavenInstaller {
// This generates POM.xml with proper parameters
pom.project {
name POM_NAME
artifactId POM_ARTIFACT_ID
// For aar it is equal to 'aar' with jar transitive dependencies won't work
packaging POM_PACKAGING
description POM_DESCRIPTION
}
}
}
transitive = true
块也是必需的...
AAR 文件不包含传递依赖项。因此,即使使用 api 而不是实现,它也不会起作用。
在我们的团队中,我们开发了一个用于应用程序的库,我们希望它仅供内部使用。早些时候,我们曾经包含似乎有效的整个模块。后来我们决定移动到 aar 文件,但我们也面临着找不到类路径的相同问题。经过一些研究,我们了解到我们也可以使用本地 maven 存储库。我们决定使用它。
这是一步一步的过程
发布存储库
1.In 需要包含的库的根 build.gradle 文件
id 'com.github.dcendents.android-maven' version '2.0' apply false
2.In 需要添加的库的模块级 build.gradle 文件
a) 在插件中
id 'maven-publish'
b) 在 gradle 文件的底部添加
publishing {
publications {
release(MavenPublication) {
groupId = 'com.demo.android'
artifactId = 'qrcodescanner'
version = '1.0.0'
afterEvaluate {
from components.release
}
}
}
repositories {
maven {
name = "qrcodescanner"
url = "${project.buildDir}/repo"
}
}
}
3.根据您给的名称,将生成一个gradle任务,您可以使用gradlew任务或使用Android工作室右上角的gradle窗口进行检查,我们的是
publishReleasePublicationToQrcodescannerRepository
4.运行它,将在给定路径中生成存储库
gradlew publishReleasePublicationToQrcodescannerRepository
最后一步,您需要将其发布到 maven 本地使用
gradlew publishToMavenLocal
如果它不起作用,您可以在执行之前尝试 Gradlew Clean 和 Gradlew 构建。
使用本地存储库
1.您需要在其他中央存储库之前在您想要使用它的项目的根级别 build.gradle 文件中添加 mavenLocal()
allprojects {
repositories {
mavenLocal()
google()
jcenter()
maven { url "https://jitpack.io" }
mavenCentral()
}
}
- 现在,您需要像处理其他依赖项一样,在项目中包含 依赖项
implementation 'com.demo.android:qrcodescanner:1.0.0'
请记住格式应分组 Id:artifactId:version
就是这样。
引用:
发布库
本地专家
只需在依赖项末尾添加@aar对我有用。
dependencies {
implementation 'org.videolan.vlc:libvlc:3.0.13@aar'
}