如何使 aar 成为库中的默认工件

How to make aar the default artifact in your library

我需要在公司自己的服务器上发布一个关于 Sonatype 的库。我在以下实现中使用了 maven-publish 插件。

apply plugin: 'maven-publish'

task androidSourcesJar(type: Jar) {
    archiveClassifier.set('sources')
    if (project.plugins.findPlugin("com.android.library")) {
        from android.sourceSets.main.java.srcDirs
        from android.sourceSets.main.kotlin.srcDirs
    }
}

afterEvaluate {
    publishing {
        publications {
            release(MavenPublication) {
                groupId GROUP_ID
                artifactId ARTIFACT_ID
                version VERSION_NAME

                from components.release
                artifact androidSourcesJar

                pom {
                    name = ARTIFACT_ID
                    description = DESCRIPTION
                    url = 'library url'
                    licenses {
                        license {
                            name = 'License'
                            url = 'license url'
                        }
                    }
                    developers {
                        developer {
                            id = 'dev id'
                            name = 'dev name'
                            email = 'dev mail'
                        }
                    }
                    scm {
                        connection = 'url.git'
                        developerConnection = 'url.git'
                        url = 'url.git'
                    }
                }
            }
        }

        repositories {
            maven {
                url MAVEN_REPOSITORY_URL
                credentials {
                    username = USER_NAME
                    password = PASSWORD
                }
            }
        }
    }
}

库已成功发布,但是当我使用它时,我必须指定我需要如下aar。

implementation 'com.companyname.android:library-name:1.0.0@aar'

没有aar规范怎么办?像下面这样。

implementation 'com.companyname.android:library-name:1.0.0'

所以Gradle可以找到aar文件并将其添加到外部库。

您必须在您的出版物中将 aar 定义为工件:

artifact("$buildDir/outputs/aar/something-release.aar")

查看 this answer 的简单示例。

我已经解决了。问题不在 pom 中,也不在我打包库的方式中。这是我在 Gradle 中定义它的方式。我曾经用这种方式在根 Gradle 中定义自定义 maven 存储库。

allprojects {
    repositories {
        google()
        mavenCentral()
        maven {
            url "http://localhost:8081/repository/maven-releases/"
            credentials {
                username = "username"
                password = "password"
            }
            allowInsecureProtocol(true)
            metadataSources{
                mavenPom()
            }
        }
    }
}

然而,documentation表示

"从 Gradle 5.3 开始,在解析元数据文件时,无论是 Ivy 还是 Maven,Gradle 都会寻找一个标记,表明存在匹配的 Gradle 模块元数据文件.如果找到,将使用它代替Ivy或Maven文件。

从 Gradle 5.6 开始,您可以通过将 ignoreGradleMetadataRedirection() 添加到 metadataSources 声明来禁用此行为。"

所以我编辑如下。

allprojects {
    repositories {
        google()
        mavenCentral()
        maven {
            url "http://localhost:8081/repository/maven-releases/"
            credentials {
                username = "username"
                password = "password"
            }
            allowInsecureProtocol(true)
            metadataSources{
                mavenPom()
                ignoreGradleMetadataRedirection()
            }
        }
    }
}