1

背景我一直在eclipse中构建一个android库项目。它最初不是用gradle构建的,而是遵循旧的android文件夹结构

现在为了将它上传到 maven cental,我首先在 sonatype 上创建了一个帐户,然后在 jira 上为一个新项目创建了一个问题。他们为我的 groupid com.github.amansatija 创建了一个仓库(为此我等了两个工作日直到问题得到解决)

现在我创建了 gpg 密钥对环

之后,我用 gradle 导出了 eclipse android 库项目,然后我将它导入到 androistudio 中,以确保它完全对 gradle 友好。现在,在将 android 库项目的构建系统更改为 gradle 之后,我遵循了 chris banes maven-push gradle 插件在 github 上部署我的库项目到 maven

以下是 gradle my system 的详细信息

我的全局 gradle.properties 文件(user_homer.gradle\gradle.properties 中的那个)包含这个

NEXUS_USERNAME=amansatija
NEXUS_PASSWORD=mushROOM@7

signing.keyId=16DF7223
signing.password=customer360
signing.secretKeyRingFile=mitul_private_key.gpg

我的项目的 gradle.properties 包含这个

VERSION_NAME=0.0.1-SNAPSHOT
VERSION_CODE=1
GROUP=com.github.amanasatija

POM_DESCRIPTION=A demo test lib to understand maven central uploads
POM_URL=https://github.com/amansatija/Cus360MavenCentralDemoLib
POM_SCM_URL=https://github.com/amansatija/Cus360MavenCentralDemoLib
POM_SCM_CONNECTION==https://github.com/amansatija/Cus360MavenCentralDemoLib.git
POM_SCM_DEV_CONNECTION==https://github.com/amansatija/Cus360MavenCentralDemoLib.git
POM_LICENCE_NAME=The Apache Software License, Version 2.0
POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
POM_LICENCE_DIST=repo
POM_DEVELOPER_ID=amansatija
POM_DEVELOPER_NAME=Aman Satija

我项目的 maven_push 文件包含以下内容

/*
 * Copyright 2013 Chris Banes
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

apply plugin: 'maven'
apply plugin: 'signing'

def isReleaseBuild() {
    return VERSION_NAME.contains("SNAPSHOT") == false
}

def getReleaseRepositoryUrl() {
    return hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL
            : "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
}

def getSnapshotRepositoryUrl() {
    return hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL
            : "https://oss.sonatype.org/content/repositories/snapshots/"
}

def getRepositoryUsername() {
    return hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME : ""
}

def getRepositoryPassword() {
println(NEXUS_PASSWORD)
println(NEXUS_USERNAME)
    return hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD : ""
}

afterEvaluate { project ->
    uploadArchives {
        repositories {
            mavenDeployer {
                beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }

                pom.groupId = GROUP
                pom.artifactId = POM_ARTIFACT_ID
                pom.version = VERSION_NAME

                repository(url: getReleaseRepositoryUrl()) {
                    authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
                }
                snapshotRepository(url: getSnapshotRepositoryUrl()) {
                    authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
                }

                pom.project {
                    name POM_NAME
                    packaging POM_PACKAGING
                    description POM_DESCRIPTION
                    url POM_URL

                    scm {
                        url POM_SCM_URL
                        connection POM_SCM_CONNECTION
                        developerConnection POM_SCM_DEV_CONNECTION
                    }

                    licenses {
                        license {
                            name POM_LICENCE_NAME
                            url POM_LICENCE_URL
                            distribution POM_LICENCE_DIST
                        }
                    }

                    developers {
                        developer {
                            id POM_DEVELOPER_ID
                            name POM_DEVELOPER_NAME
                        }
                    }
                }
            }
        }
    }

    signing {

        required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") }
        sign configurations.archives
    }

    task androidJavadocs(type: Javadoc) {
        source = android.sourceSets.main.java.srcDirs
        classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
    }

    task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
        classifier = 'javadoc'
        from androidJavadocs.destinationDir
    }

    task androidSourcesJar(type: Jar) {
        classifier = 'sources'
        from android.sourceSets.main.java.sourceFiles
    }

    artifacts {
        archives androidSourcesJar
        archives androidJavadocsJar
    }
}

如您所见,我让它打印了 nexus 用户名和密码,脚本似乎已正确找到凭据

下面是我的 lib 模块的 build.gradle

    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:0.12.+'
        }
    }
    apply plugin: 'com.android.library'

    dependencies {
        compile fileTree(dir: 'libs', include: '*.jar')
    }

    android {
        compileSdkVersion 21
        buildToolsVersion "21.0.1"

        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_7
            targetCompatibility JavaVersion.VERSION_1_7
        }

        sourceSets {
            main {
                manifest.srcFile 'AndroidManifest.xml'
                java.srcDirs = ['src']
                resources.srcDirs = ['src']
                aidl.srcDirs = ['src']
                renderscript.srcDirs = ['src']
                res.srcDirs = ['res']
                assets.srcDirs = ['assets']
            }

            // Move the tests to tests/java, tests/res, etc...
            instrumentTest.setRoot('tests')

            // Move the build types to build-types/<type>
            // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
            // This moves them out of them default location under src/<type>/... which would
            // conflict with src/ being used by the main source set.
            // Adding new build types or product flavors should be accompanied
            // by a similar customization.
            debug.setRoot('build-types/debug')
            release.setRoot('build-types/release')
        }
    }

apply from: '../maven_push.gradle'

下面也是我的库模块的 gradle.properties 文件

POM_NAME=DemoLibMavenCentral
POM_ARTIFACT_ID=DemoLibMavenCentral
POM_PACKAGING=aar

如您所见,我已经适当地遵循了 turoial 但是当我执行 gradlew clean uploadArchives 任务时,一切都很顺利,除了最后一步它说失败访问被拒绝

What went wrong:Execution failed for task ':DemoLibManvenCentral:uploadArchives'.Could not publish configuration 'archives'
Error deploying artifact 'com.github.amanasatija:library:apk': 
Error deploying artifact: Authorization failed: Access denied to: https://oss.sonatype.org/content/repositories/snapshots/com/github/amanasatija/library/0.0.1-SNAPSHOT/library-0.0.1-20141114.123550-1.apk

帮帮我……请……

编辑

解决方案::

所以我终于设法解决了这个问题。显然问题是

VERSION_NAME=0.0.1-SNAPSHOT

在我的项目的 gradle.properties 文件中,当我将上面的行更改为以下内容时

VERSION_NAME=0.0.1

它似乎工作正常..标签 SNAPSHOT 导致我的工件被部署到 snotype 的快照存储库,并且由于某种原因快照存储库显然不适合您的工件,我猜它只是想要图片或快照你的申请

4

1 回答 1

0

您似乎无权在服务器上发布 com.github.amanasatija 组 ID 的工件。

https://issues.sonatype.org的“社区支持 - 开源项目存储库托管”项目下为此提出问题,我们将帮助您解决这个问题。

于 2014-11-15T22:19:13.250 回答