【问题标题】:How to make aar the default artifact in your library如何使 aar 成为库中的默认工件
【发布时间】:2021-11-11 09:15:58
【问题描述】:

我需要在公司自己的服务器上发布一个关于 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 文件并将其添加到外部库中。

【问题讨论】:

    标签: android gradle nexus sonatype maven-publish


    【解决方案1】:

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

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

    查看this answer 的简单示例。

    【讨论】:

    • 这将导致具有相同扩展错误的多个工件。正如from components.release 做同样的工作。但是,我已经尝试过它而不是 from components.release 并没有帮助:/
    【解决方案2】:

    我已经解决了。问题不在于 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 Module Metadata 文件。如果找到,将使用它来代替 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()
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-12-22
      • 2018-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-27
      • 1970-01-01
      • 2019-04-03
      相关资源
      最近更新 更多