将 aar 文件发布到 Maven Central Gradle 不工作

Publish an aar file to Maven Central with Gradle not working

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

好吧,让我们重复我所遵循的所有步骤来设法"Publish an aar file to Maven Central with Gradle"(我主要遵循这个guide),只是为了确定...

1) 我使用 "Android Studio" 并且我有这个简单的 android 库,我希望在 maven 上可用:https://github.com/danielemaddaluno/Android-Update-Checker

2) 在 UpdateCheckerLib 文件夹中我有上面提到的 lib 代码。并在该文件夹 apply plugin: 'com.android.library' 的 build.gradle 中应用,我在模块目录的 build/outputs/aar/ 目录中得到一个 .aar 作为输出

3) 我的第一步是找到一个批准的存储库。我决定使用Sonatype OSS Repository。在这里我注册了一个项目打开一个新的问题(创建 --> 创建问题 --> 社区支持 - 开源项目存储库托管 --> 新项目) with groupid 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) 我读到对于要上传到中心的每个模块或应用程序,我应该:

所以在 UpdateCheckerLib 文件夹中我:

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 在终端中,因为 "Andoid 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 插件问题,但我想分享所有过程,以防对其他人有所帮助!

提前致谢!


将 aar 文件发布到 jCenter Gradle 仍然无法正常工作:

非常感谢 JBaruch 和他的回答!所以我试图发布到 jCenter 而不是 Maven Central,因为事实上 jcenter() 是 mavenCentral() 的超集。 好的,让我们从我的 github 图书馆 Android-Update-Checker 重新开始。 我试图遵循他的一些提示,但我仍然卡住了...... 我还将为 jcenter 发布编写我的步骤(希望对某人有用)。也许我遗漏了什么...

1) 使用 username 注册到 Bintray:danielemaddaluno

2) 启用上传内容的自动签名:
来自 Bintray profile url --> GPG 签名 --> 复制粘贴你的 public/private keys。您可以在文件 public_key_sender.asc/private_key_sender.asc 中分别找到这两个 如果执行以下代码(gpg中的-a--armor选项用于生成ASCII-armored密钥对):

    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) 在同一个 web page 中,您可以从以下位置配置自动签名:存储库 --> Maven --> 检查 "GPG Sign uploaded files automatically" --> 更新

3) 在同一个web page中可以找到你的Bintray API Key(复制以备后用)

4) 在同一个 web page 中你可以配置你的 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)在我的PATH中添加了"Android Studio"实际使用的默认gradle 2.2.1,例如:

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

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

gradle bintrayUpload

10) From Bintray --> My Recent Packages --> androidupdatechecker (这是在上一点9执行后才出现的) --> 添加到Jcenter --> 勾选--> 组 ID = "com.github.danielemaddaluno.androidupdatechecker".

11) 最后我尝试遵循:Bintray --> 我最近的包 --> androidupdatechecker --> Maven Central --> 同步但是我在 "Sync Status"页面右侧栏:

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.

您可以改为将 aar 发布到 JCenter。

  1. 这是 default in Android Studio
  2. 你可以sync to Central from there in much easier way.
  3. so much easier to publish there
  4. 您可以使用 oss.jfrog.org for snapshots.

我需要将我的 aar 文件发布到 JCenter,然后将其与 Maven Central 同步的每一步都可以在这里阅读: https://github.com/danielemaddaluno/gradle-jcenter-publish