使用多个模块将快照发布到 oss.jfrog.org 失败并显示 403

Publish Snapshot to oss.jfrog.org with multiple modules fails with 403

我正在尝试将包含多个模块的项目发布到 artifactory (oss.jfrog.org)。当我 运行 artifactoryPublish 我收到 403 错误,但我知道这不是权限问题,因为它适用于单个模块。它只是尝试发布多个模块失败。

有些模块是aars,有些是jar,都包含源代码。我可以将它们全部发布到 Bintray,但不能发布到 artifactory(用于快照)。

所以问题是,如何配置多模块项目以将快照发布到 oss.jfrog.org。

我发现如果我将它更改为发布单个模块并使工件名称与组的最后一部分相同,它可以工作,但不同的名称不起作用(给出 403 错误).

因此,如果群组是 com.example.foo,我可以发布 foo.jar (com/example/foo/foo/1.0.0-SNAPSHOT/foo-1.0.0.jar)。但是我无法发布 bar.jar (com/example/foo/bar/1.0.0-SNAPSHOT/bar.jar).

此 gradle 包含在每个项目的 build.gradle

afterEvaluate {
    publishing {
        publications {
            mavenPublication(MavenPublication) {
                artifact sourcesJar
            if (project.plugins.hasPlugin("com.android.library")) {
                artifact("$buildDir/outputs/aar/${project.name}-debug.aar")
            } else {
                artifact("$buildDir/libs/${project.name}-${version}.jar")
            }
            groupId "com.example.foo"
            artifactId project.name // changing this to "foo" works for a single project
            version version
            pom {
                name.set(project.name)
                url.set(POM_URL)

                packaging POM_PACKAGING
                version version

                licenses {
                    license {
                        name.set(POM_LICENSE_NAME)
                        url.set(POM_LICENSE_URL)
                    }
                }

                developers {
                    developer {
                        name.set(POM_DEVELOPER)
                        }
                    }

                    scm {
                        url.set(POM_SCM_URL)
                        connection.set(POM_SCM_CONNECTION)
                        developerConnection.set(POM_SCM_DEV_CONNECTION)
                    }
                }
            }
        }
    }


    bintray {
        user = project.findProperty('bintrayUser') ?: System.getenv('BINTRAY_USER')
        key = project.findProperty('bintrayApiKey') ?: System.getenv('BINTRAY_API_KEY')
        configurations = ['archives']
        publish = true
        dryRun = true
        pkg {
            name = project.name
            repo = BINTRAY_REPO
            userOrg = BINTRAY_ORG
            licenses = [POM_LICENSE_NAME]
            vcsUrl = POM_SCM_URL
            version {
                name = project.name
                released = new Date()
            }
        }
    }

    artifactory {
        contextUrl = 'http://oss.jfrog.org'
        publish {
            repository {
                repoKey = 'oss-snapshot-local'
                username = project.findProperty('bintrayUser') ?: System.getenv('BINTRAY_USER')
                password = project.findProperty('bintrayApiKey') ?: System.getenv('BINTRAY_API_KEY')
            }
            defaults {
                publications('mavenPublication')
                publishArtifacts = true
                publishPom = true
            }
        }
        resolve {
            repoKey = 'jcenter'
        }
    }
}

Artifactory returns 每当您尝试发布已存在的人工制品时都会返回 403。在您的情况下,如果您之前已经从多模块构建中发布了快照人工制品,那么每当您再次尝试这样做时,您都会收到 403。我知道您可以配置用户访问权限以提供对您正在使用的帐户的删除权限部署,如 here 所示。但是,覆盖历史记录并不是一个好习惯。

关于重命名您的组和人工制品,我认为这不会提供解决方案,因为问题不是您的 GAV 坐标,而是具有匹配的 GAV 的人工制品已经存在的事实。

请问,为什么要使用 SNAPSHOT 工件?不能用动态依赖和依赖锁实现同样的行为吗?