使用Gradle的POM缺少Android库依赖项

使用Gradle的POM缺少Android库依赖项,android,maven,gradle,android-library,Android,Maven,Gradle,Android Library,我正在使用Gradle构建一个Android库项目,并将其作为aar部署到maven存储库中 该库有一些依赖项,应该包含在POM中 使用apply插件:“maven”不存在POM文件,只有工件 使用apply plugin:'maven publish'将生成一个POM文件,但它不包含任何依赖项 有什么想法吗?这是不受支持的吗 Gradle 2.2和Android Gradle插件1.1.0 第一种方法: configurations { archives { exten

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

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

使用
apply插件:“maven”
不存在POM文件,只有工件

使用
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'
            }
        }
    }
}
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'
            }
        }
    }
}
还尝试了它,但没有将其包装在
afterEvaluate

第二种方法:

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'
            }
        }
    }
}
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'
            }
        }
    }
}
更新

问题的根本原因是这个项目使用了香料。使用
apply plugin:'maven'
尝试mavenDeployer:


在这里,您可以设置pom详细信息。您将获得一个名为
uploadArchives
的新目标。执行时,它将部署到给定的回购协议。

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

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不遵循这个maven概念,这意味着如果您部署快照依赖关系,Gradle将不会更新它们,如果它已经获得相同的版本(AFAIK),谢谢,但这正是我提到的
apply plugin:'maven'
时的真正意思,我将为这两个变量发布一些代码,需要再次阅读->您不希望此pom中存在依赖项。没有理由这样做,因为您的依赖项被烘焙到工件中。编译就是这样做的。这个pom只是对您的工件的描述。只烘焙jar依赖项。aar依赖项是可传递的,需要在POM中引用,或者显式地包含在宿主应用程序的构建文件中。以otto为例:似乎我从来没有遇到过这个问题,但las建议:看看这里,最好将
配置.compile.allDependencies.each
替换为
配置.compile.allDependencies.withType(ModuleDependency)
以避免在使用
编译文件树(dir:'libs',包括:['*.jar']
注意configurations.compile.allDependencies.已经过时。对于当前版本的gradle,它应该是configurations.implementation.allDependencies或其变体(例如api而不是实现)@Syzygy上面的代码有一个错误,因为ModuleDependency in with method and before dp->不是同一个单词,是拼写错误吗?当我在一个模块中有很多风格时,我该怎么办?我不想在每个风格发布中编写pox.withXml。不确定,但可能
匹配回退
会有帮助吗?