Gradle中POM文件缺失Android库依赖项

15

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

该库有一些依赖项,应包含在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。如果不使用flavors,在使用apply plugin: 'maven'时,pom文件将被正确生成。

2个回答

19
这是最终为我解决问题的解决方案:
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
            }      
        }
    }
}

1
最好使用configurations.compile.allDependencies.withType(ModuleDependency)替换configurations.compile.allDependencies.each,以避免在使用compile fileTree(dir: 'libs', include: ['*.jar'])时出现异常。 - Denys Vasylenko
当一个模块有多个风味时,我该怎么办?我不想在每个风味发布中都写pox.withXml。 - peerless2012
不确定,但也许 matchingFallbacks 可以帮助解决问题?https://developer.android.com/studio/build/dependencies#resolve_matching_errors - Philipp E.
无法将withXml()应用于生成的POM 无法获取类型为org.gradle.api.internal.artifacts.configurations.DefaultConfigurationContainer的配置容器的未知属性“implementation”。 - desgraci
这个问题可以通过应用java插件来解决,但是依赖项仍然缺失。 - desgraci
显示剩余2条评论

0

尝试使用mavenDeployer:http://gradle.org/docs/current/userguide/maven_plugin.html

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: "file://localhost/tmp/myRepo/")
            pom.version = '1.0Maven'
            pom.artifactId = 'myMavenName'
        }
    }
}

在这里,您可以设置pom的详细信息。您将得到一个名为uploadArchives的新目标。执行时,它会部署到指定的repo。


小心SNAPSHOT依赖项,Gradle不遵循这个Maven概念,这意味着如果您部署了SNAPSHOT依赖项,如果已经有相同版本,Gradle将不会更新它们(据我所知)。 - sschrass
谢谢,但我提到apply plugin: 'maven'时,那实际上就是我的意思。我将为两个变体发布一些代码。 - Philipp E.
需要再次阅读 -> 你不想在这个POM中包含依赖项。没有必要这样做,因为您的依赖项已经包含在构件中了。这就是编译的作用。这个POM只是对您的构件的描述。 - sschrass
确切地说,它们是由他人提供的,这就是为什么必须引用它们。请看我提供的链接,或者查看任何依赖其他库的jcenter上的aar库。 - Philipp E.
1
似乎我从未遇到过这个问题,不过最后的建议是:在这里查看 https://github.com/spring-projects/gradle-plugins/tree/master/propdeps-plugin - sschrass
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接