带有 Gradle 的 POM 中缺少 Android 库依赖项

标签 android maven gradle android-library

我正在使用 Gradle 构建一个 Android 库项目并将其作为 aar 部署到 Maven 存储库。

库有一些依赖,应该包含在POM中

使用 apply plugin: 'maven' 不存在 POM 文件,只有 Artifact

通过 apply plugin: 'maven-publish' 生成了一个 POM 文件,但它不包含任何依赖项

有什么想法吗?这只是不支持吗?

Gradle 2.2 和 Android Gradle 插件 1.1.0

第一种方法:

configurations {
    archives {
        extendsFrom configurations.default
    }
}

afterEvaluate { project ->
    uploadArchives {

        configuration = configurations.archives

        repositories {
            mavenDeployer {
                repository(url: "http://nexus-url") {
                    authentication(userName: nexusUsername, password: nexusPassword)

                pom.groupId = 'com.example'
                pom.version = '123-SNAPSHOT'
                pom.artifactId = 'foo'
                pom.packaging = 'aar'

                pom.project {
                    artifactId = 'bar'
                    packaging 'aar'
                    description 'baz'
            }
        }
    }
}

也尝试过不将其包装在 afterEvaluate

第二种方法:

publishing {
    publications {
        sdk(MavenPublication) {
            groupId 'com.example'
            artifactId 'foo'
            version = "0.123-SNAPSHOT"
            artifact("$buildDir/outputs/aar/app-sdk-debug.aar")
        }
    }
    repositories {
        maven {
            url "http://nexus-url"
            credentials {
                username 'foo'
                password 'bar'
            }
        }
    }
}

更新

问题的根本原因是这个项目使用了flavors。如果没有口味,则在使用 apply plugin: 'maven'

时会正确生成 pom

最佳答案

这是最终对我有用的解决方案:

publishing {
    publications {
        sdk(MavenPublication) {
            artifactId libName
            artifact "${project.buildDir}/outputs/aar/${libName}-${project.version}.aar"

            //The publication doesn't know about our dependencies, so we have to manually add them to the pom
            pom.withXml {
                // for dependencies and exclusions
                def dependenciesNode = asNode().appendNode('dependencies')
                configurations.implementation.allDependencies.withType(ModuleDepend‌​ency) { ModuleDependency dp ->
                    def dependencyNode = dependenciesNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId', dp.group)
                    dependencyNode.appendNode('artifactId', dp.name)
                    dependencyNode.appendNode('version', dp.version)

                    // for exclusions
                    if (dp.excludeRules.size() > 0) {
                        def exclusions = dependencyNode.appendNode('exclusions')
                        dp.excludeRules.each { ExcludeRule ex ->
                            def exclusion = exclusions.appendNode('exclusion')
                            exclusion.appendNode('groupId', ex.group)
                            exclusion.appendNode('artifactId', ex.module)
                        }
                    }
                }
            }
        }
    }

    repositories {
        maven {
            name 'myrepo'
            url 'https://maven.foo.com'

            credentials {
                username mavenUsername
                password mavenPassword
            }      
        }
    }
}

关于带有 Gradle 的 POM 中缺少 Android 库依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28827593/

相关文章:

android - Android 项目的 Maven 原型(prototype)

Java - 编译错误 : cannot access Function

java - 我正在尝试从链接下载图像并将其显示在 ImageView 中,但行 imgView.setImageBitmap(myImg);抛出一些错误

java - 第二次尝试打开日历应用程序崩溃

java - 无法找到/解决 Artifact : Maven error

java - Gradle jar 任务 : what is includes path pattern relative to?

android - gradle build:任务 ':app:validateSigningAutomationRelease'的执行失败

java - Android Studio 不显示 java 类源

java - 更新版本并将共享首选项转储到数据库中

android - 从 App Store 和 Google Play 将每个移动应用程序下载到 Mac 或 PC 的最快/最简单方法是什么?