使用Gradle将aar文件发布到Maven Central不起作用

12

使用Gradle将aar文件发布到Maven Central仍然无法工作:

好的,让我们重复一下我遵循的所有步骤,以确保“使用Gradle将aar文件发布到Maven Central”(主要遵循这个指南)...

1)我使用“Android Studio”,我有一个简单的Android库,我希望该库在maven上可用:https://github.com/danielemaddaluno/Android-Update-Checker

2)在UpdateCheckerLib文件夹中,我有上面提到的库代码。在此文件夹的build.gradle中应用apply plugin: 'com.android.library',我得到了一个.aar文件,位于模块目录下的build/outputs/aar/目录中

3)我的第一步是找到一个批准的存储库。我决定使用Sonatype OSS Repository。在这里,我注册了一个项目,开启了新问题(Create --> Create Issue --> Community Support - Open Source Project Repository Hosting --> New Project),组ID为com.github.danielemaddaluno。

4)因此,在我的项目根目录中添加了一个文件:maven_push.gradle

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

def sonatypeRepositoryUrl
if (isReleaseBuild()) {
    println 'RELEASE BUILD'
    sonatypeRepositoryUrl = hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL
            : "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
} else {
    println 'DEBUG BUILD'
    sonatypeRepositoryUrl = hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL
            : "https://oss.sonatype.org/content/repositories/snapshots/"
}

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

def getRepositoryPassword() {
    return hasProperty('nexusPassword') ? nexusPassword : ""
}

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

                pom.artifactId = POM_ARTIFACT_ID

                repository(url: sonatypeRepositoryUrl) {
                    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.sourceFiles
    }

    task androidJavadocsJar(type: Jar) {
        classifier = 'javadoc'
        //basename = artifact_id
        from androidJavadocs.destinationDir
    }

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

    artifacts {
        //archives packageReleaseJar
        archives androidSourcesJar
        archives androidJavadocsJar
    }
}

6) 我在根目录下的gradle.properties文件中添加了以下几行:

VERSION_NAME=1.0.1-SNAPSHOT
VERSION_CODE=2
GROUP=com.github.danielemaddaluno

POM_DESCRIPTION=Android Update Checker
POM_URL=https://github.com/danielemaddaluno/Android-Update-Checker
POM_SCM_URL=https://github.com/danielemaddaluno/Android-Update-Checker
POM_SCM_CONNECTION=scm:git@github.com:danielemaddaluno/Android-Update-Checker.git
POM_SCM_DEV_CONNECTION=scm:git@github.com:danielemaddaluno/Android-Update-Checker.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=danielemaddaluno
POM_DEVELOPER_NAME=Daniele Maddaluno

7)我在根目录下修改了build.gradle文件,从以下内容:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

变成这样:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0'
    }
}

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

allprojects {
    version = VERSION_NAME
    group = GROUP

    repositories {
        mavenCentral()
    }
}

apply plugin: 'android-reporting'

8) 我读到,对于我想要上传到中央仓库的每个模块或应用程序,我应该:

  • 提供一个 gradle.properties
  • 修改 build.gradle,在最后添加以下行:apply from: '../maven_push.gradle'

因此,在 UpdateCheckerLib 文件夹中,我:

  • 添加了一个 gradle.properties:

  • POM_NAME=Android Update Checker
    POM_ARTIFACT_ID=androidupdatechecker
    POM_PACKAGING=aar
    
  • 在build.gradle文件底部添加以下行:apply from: '../maven_push.gradle'

9) 为了对我的工件进行签名,我进行了以下操作:

gpg --gen-key
gpg --list-keys  --> get my PubKeyId...
gpg --keyserver hkp://pool.sks-keyservers.net --send-keys PubKeyId

10)我在路径 ~/.gradle/gradle.properties 中添加了一个文件,其内容如下(要获取密钥,我使用了 gpg --list-secret-keys 命令):

signing.keyId=xxxxxxx
signing.password=YourPublicKeyPassword
signing.secretKeyRingFile=~/.gnupg/secring.gpg

nexusUsername=YourSonatypeJiraUsername
nexusPassword=YourSonatypeJiraPassword

11) 在终端输入sudo apt-get install gradle。因为"Android Studio"终端无法识别gradle...

12) 最后运行gradle uploadArchives

13) 我遇到了这个错误:

FAILURE: Build failed with an exception.

* Where: 
Build file '/home/madx/Documents/Workspace/Android-Update-Checker/UpdateCheckerLib/build.gradle' line: 1

* What went wrong:
A problem occurred evaluating project ':UpdateCheckerLib'.
> Could not create plugin of type 'LibraryPlugin'.

可能只是由于gradle/gradle插件问题,但我想分享整个过程,以防对其他人有帮助!

提前感谢!


使用Gradle将aar文件发布到jCenter仍未起作用:

非常感谢JBaruch及其答案!因此,我正在尝试发布到jCenter而不是Maven Central,因为实际上jcenter()是mavenCentral的超集。

好的,让我们从我的github库Android-Update-Checker重新开始。我尝试遵循他的一些提示,但我还是卡住了......我也要为jcenter发布编写我的步骤(希望对某人有用)。 也许我漏了什么......

1)使用username:danielemaddaluno注册Bintray

2)启用上传内容的自动签名:
从 Bintrayprofile url--> GPG Signing --> 复制粘贴您的public/private keys。如果执行以下代码,则分别可以在文件中找到这两个键public_key_sender.asc/private_key_sender.ascgpg中的-a--armor选项用于生成ASCII装甲的密钥对):

    gpg --gen-key
    gpg -a --export daniele.maddaluno@gmail.com > public_key_sender.asc
    gpg -a --export-secret-key daniele.maddaluno@gmail.com > private_key_sender.asc
2.1) 在同一网页中,您可以进行自动签名配置:Repositories --> Maven --> 选择 "GPG Sign uploaded files automatically" --> 更新
3) 在同一网页中,您可以找到您的Bintray API Key(复制它以备后用)
4)在同一网页中,您可以配置您的Sonatype OSS User(在此前问题的部分中我已经创建了一个用户和一个问题)
5) 我在根目录下的 build.gradle 中添加了这两行
classpath 'com.github.dcendents:android-maven-plugin:1.2'
classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.1"

因此,我自己根目录下的build.gradle看起来是这样的:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0'
        classpath 'com.github.dcendents:android-maven-plugin:1.2'
        classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.1"
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

6) 我修改了位于项目文件夹中的 build.gradle,它现在看起来像这样:

apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: "com.jfrog.bintray"

// This is the library version used when deploying the artifact
version = "1.0.0"

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        //applicationId "com.madx.updatechecker.lib"
        minSdkVersion 8
        targetSdkVersion 21
        versionCode 1
        versionName "1.0.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'org.jsoup:jsoup:1.8.1'
}


def siteUrl = 'https://github.com/danielemaddaluno/Android-Update-Checker'      // Homepage URL of the library
def gitUrl = 'https://github.com/danielemaddaluno/Android-Update-Checker.git'   // Git repository URL
group = "com.github.danielemaddaluno.androidupdatechecker"                      // Maven Group ID for the artifact


install {
    repositories.mavenInstaller {
        // This generates POM.xml with proper parameters
        pom {
            project {
                packaging 'aar'

                // Add your description here
                name 'The project aims to provide a reusable instrument to check asynchronously if exists any newer released update of your app on the Store.'
                url siteUrl

                // Set your license
                licenses {
                    license {
                        name 'The Apache Software License, Version 2.0'
                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }
                developers {
                    developer {
                        id 'danielemaddaluno'
                        name 'Daniele Maddaluno'
                        email 'daniele.maddaluno@gmail.com'
                    }
                }
                scm {
                    connection gitUrl
                    developerConnection gitUrl
                    url siteUrl

                }
            }
        }
    }
}

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

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

task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}
artifacts {
    archives javadocJar
    archives sourcesJar
}



Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())

bintray {
    user = properties.getProperty("bintray.user")
    key = properties.getProperty("bintray.apikey")

    configurations = ['archives']
    pkg {
        repo = "maven"
        name = "androidupdatechecker"
        websiteUrl = siteUrl
        vcsUrl = gitUrl
        licenses = ["Apache-2.0"]
        publish = true
    }
}

7)我在根目录的local.properties文件中添加了以下行:

bintray.user=<your bintray username>
bintray.apikey=<your bintray API key>

8)将“Android Studio”默认使用的Gradle 2.2.1添加到我的PATH环境变量中,例如:

PATH=$PATH:/etc/android-studio/gradle/gradle-2.2.1/bin

9) 打开 "Android Studio" 终端并执行:

gradle bintrayUpload

10)从Bintray -> 我的最近软件包 -> androidupdatechecker(只有在执行前一个步骤9后才会出现此选项) -> 添加到Jcenter -> 选中框 -> Group Id =“com.github.danielemaddaluno.androidupdatechecker”。

11)最后我尝试按照以下步骤操作:Bintray -> 我的最近软件包 -> androidupdatechecker -> Maven Central -> 同步,但我在页面右侧的“同步状态”栏中收到了以下错误:

Last Synced: Never
Last Sync Status: Validation Failed
Last Sync Errors: 
Missing Signature: 
'/com/github/danielemaddaluno/androidupdatechecker/UpdateCheckerLib/1.0.0/UpdateCheckerLib-1.0.0-javadoc.jar.asc' 
does not exist for 'UpdateCheckerLib-1.0.0-javadoc.jar'. 
Missing Signature: 
'/com/github/danielemaddaluno/androidupdatechecker/UpdateCheckerLib/1.0.0/UpdateCheckerLib-1.0.0.aar.asc' 
does not exist for 'UpdateCheckerLib-1.0.0.aar'. 
Missing Signature: 
'/com/github/danielemaddaluno/androidupdatechecker/UpdateCheckerLib/1.0.0/UpdateCheckerLib-1.0.0-sources.jar.asc' 
does not exist for 'UpdateCheckerLib-1.0.0-sources.jar'. 
Missing Signature: 
'/com/github/danielemaddaluno/androidupdatechecker/UpdateCheckerLib/1.0.0/UpdateCheckerLib-1.0.0.pom.asc' 
does not exist for 'UpdateCheckerLib-1.0.0.pom'. 
Invalid POM: /com/github/danielemaddaluno/androidupdatechecker/UpdateCheckerLib/1.0.0/UpdateCheckerLib-1.0.0.pom: 
Project description missing Dropping existing partial staging repository.
2个回答

13

1
然而,我在这里清楚地为像我这样的新手人员重写了以下步骤:https://github.com/danielemaddaluno/gradle-jcenter-publish (第16步返回前面评论中描述的错误) - madx
1
什么失败了?哪个依赖项找不到了?(就是它)。 - JBaruch
1
关于 Nexus 发送的愚蠢邮件,您可以安全地忽略它们。Bintray 中的同步状态是您所需的全部内容。 - JBaruch
1
你能否尝试使用特定版本的 androidupdatechecker?使用最新版本是一个可怕的想法(虽然它应该可以工作)。 - JBaruch
1
是的!就是这个加号!没有它也可以正常工作!所以使用以下依赖项,它可以编译通过:dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.android.support:appcompat-v7:+' compile 'com.google.android.gms:play-services:+' compile 'com.github.danielemaddaluno.androidupdatechecker:library:1.0.2' }再次感谢您,大师!您一直在整个发布过程中给予我指导! - madx
显示剩余10条评论

7

谢谢分享!上传artifact到jCentral没有更简单的方法吗?在我看来,这应该是一个相当常见的操作,并且只需在gradle构建文件中添加几行代码即可完成。我相信所描述的方法可以奏效(我将遵循它),但是17个步骤、创建2个帐户以及在gradle文件中进行所有额外的自定义似乎有些繁琐。 - vir us
1
我希望它存在,但我不知道其他方法。 :-) 然而,这些步骤中有些必须只在第一次上传工件时完成。如果您发现更简单的方法,请告诉我。 :-D - madx
1
我知道这是一个旧答案,但jcenter已经死了。 - spy

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