Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Publish an aar file to Maven Central with Gradle not working

Publish an aar file to Maven Central with Gradle still not working:

Ok, let's repeat all the steps I followed to manage to "Publish an aar file to Maven Central with Gradle" (I mainly followed this guide), just to be sure...

1) I use "Android Studio" and I have this simple android lib that I would like to be available on maven: https://github.com/danielemaddaluno/Android-Update-Checker

2) In the UpdateCheckerLib folder I have the lib code abovementioned. And applying in the build.gradle of this folder apply plugin: 'com.android.library' i got as output an .aar in the build/outputs/aar/ directory of the module's directory

3) My first step was to find an approved repository. I decided to use the Sonatype OSS Repository. Here I registered a project opening a new Issue (Create --> Create Issue --> Community Support - Open Source Project Repository Hosting --> New Project) with groupid com.github.danielemaddaluno

4) So I added in the root of my project a file: 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) I added in the file gradle.properties located in the root the following lines:

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:[email protected]:danielemaddaluno/Android-Update-Checker.git
POM_SCM_DEV_CONNECTION=scm:[email protected]: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) Inside the root I modified the build.gradle from this:

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

allprojects {
    repositories {
        jcenter()
    }
}

To this:

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) I read that for each module or application I want to upload to central, I should:

  • provide a gradle.propeties
  • modify build.gradle to add the following line at the end: apply from: '../maven_push.gradle'

So in the UpdateCheckerLib folder I:

  • Added a gradle.properties:

    POM_NAME=Android Update Checker
    POM_ARTIFACT_ID=androidupdatechecker
    POM_PACKAGING=aar
    
  • Modified the build.gradle adding at the bottom of the file the following line: apply from: '../maven_push.gradle'

9) In order to sign my artifacts I did:

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

10) I added a file to ~/.gradle/gradle.properties path with a content like this (to get the secret key I used 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 in the terminal because "Andoid Studio" teminal didn't recognize gradle...

12) Finally gradle uploadArchives

13) I got this error:

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'.

Probably it is simply due a gradle/gradle plugin problem, but I wanted to share all the procedure, just in case it could be helpful for someone else!

Thanks in advance!


Publish an aar file to jCenter with Gradle still not working:

A great thanks goes to JBaruch and his anwer! So I'm trying to publish to jCenter instead of Maven Central, as the matter of fact that jcenter() is a superset of mavenCentral(). Ok let's start again from my github library Android-Update-Checker. I tried to follow some of his tips but I'm still stuck... I'm going to write my steps also for the jcenter publishing (hoping that could be useful to someone). Maybe I'm missing something...

1) Registered to Bintray with username: danielemaddaluno

2) Enabling the automatically signing of the uploaded content:
from Bintray profile url --> GPG Signing --> copy paste your public/private keys. You can find respectively these two in files public_key_sender.asc/private_key_sender.asc if you execute the following code (the -a or --armor option in gpgis used to generate ASCII-armored key pair):

    gpg --gen-key
    gpg -a --export [email protected] > public_key_sender.asc
    gpg -a --export-secret-key [email protected] > private_key_sender.asc

2.1) In the same web page you can configure the auto-signing from: Repositories --> Maven --> Check the "GPG Sign uploaded files automatically" --> Update

3) In the same web page you can find your Bintray API Key (copy it for a later use)

4) In the same web page you can configure your Sonatype OSS User (in the previous section of the question I already created a user and a issue)

5) I added these two lines to the build.gradle in the root

classpath 'com.github.dcendents:android-maven-plugin:1.2'
classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.1"

So that my own build.gradle in the root looks like:

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) I modified my build.gradle located inside my project folder, and it looks like:

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 '[email protected]'
                    }
                }
                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) I added to the root local.properties file the following lines:

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

8) Added to my PATH the default gradle 2.2.1 actually used by "Android Studio", for example:

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

9) Open "Android Studio" terminal and execute:

gradle bintrayUpload

10) From Bintray --> My Recent Packages --> androidupdatechecker (this is here only after the execution of the previous point 9 ) --> Add to Jcenter --> Check the box --> Group Id = "com.github.danielemaddaluno.androidupdatechecker".

11) Finally I tryed to follow: Bintray --> My Recent Packages --> androidupdatechecker --> Maven Central --> Sync but I got this error in the "Sync Status" bar on the right of the page:

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.
like image 335
madx Avatar asked Feb 07 '15 14:02

madx


People also ask

How do I publish AAR to Maven?

Uploading Android AAR to Local Maven RepositoryCreate an empty project without any activity. Create an AAR module. The URL file:\\DESKTOP-3PCHU10\site\ is a shared folder. Add “apply from: 'maven-publish.


1 Answers

You can publish your aar to JCenter instead.

  1. It's the default in Android Studio.
  2. You can sync to Central from there in much easier way.
  3. It's so much easier to publish there.
  4. You can use oss.jfrog.org for snapshots.
like image 191
JBaruch Avatar answered Oct 15 '22 09:10

JBaruch