Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Distribuire una libreria java per usarla come dipendenza gradle

Distribuire una libreria java per usarla come dipendenza gradle

Presentation from Google I/O Extended Genova 2016.

Paolo Montalto

May 18, 2016
Tweet

More Decks by Paolo Montalto

Other Decks in Programming

Transcript

  1. #IOextendedGE16
    DISTRIBUIRE UNA LIBRERIA JAVA
    PER USARLA COME DIPENDENZA
    GRADLE
    +PaoloMontalto

    View full-size slide

  2. #IOextendedGE16
    DIPENDENZE
    +PaoloMontalto
    Librerie di terze parti o altri progetti necessari
    alla compilazione di un progetto software
    Non ha senso:
    ¤  Reinventare la ruota ad ogni nuovo progetto
    ¤  Portarsi dietro delle classi facendo copia e incolla da altri progetti
    ¤  Portarsi dietro dei jar di versione e provenienza dubbia
    ¤  Fare copia e incolla da Stackoverflow

    View full-size slide

  3. #IOextendedGE16
    DIPENDENZE
    +PaoloMontalto
    Librerie di terze parti o altri progetti necessari
    alla compilazione di un progetto software
    Non ha senso:
    ¤  Reinventare la ruota ad ogni nuovo progetto
    ¤  Portarsi dietro delle classi facendo copia e incolla da altri progetti
    ¤  Portarsi dietro dei jar di versione e provenienza dubbia
    ¤  Fare copia e incolla da Stackoverflow
    build automation

    View full-size slide

  4. #IOextendedGE16
    MAVEN
    +PaoloMontalto
    Forse il più noto sistema di build automation
    ¤ consente di definire il ciclo di vita di un processo di build
    ¤ definisce le dipendenze del proge4o
    ¤ file di configurazione basa5 su XML
    ¤ repository di librerie
    Identifica le dipendenze tramite
    groupId identifica il progetto univocamente it.xabaras.android.logger
    artifactId è il nome della libreria (senza versione) Logger
    version è il numero di versione della libreria 1.3.6
    E’ possibile distribuire più artifact nella stessa versione:
    libreria, documentazione, sorgenti

    View full-size slide

  5. #IOextendedGE16
    MAVEN
    +PaoloMontalto

    it.xabaras.android.logger
    Logger
    1.3.6
    pom

    View full-size slide

  6. version
    #IOextendedGE16
    GRADLE
    +PaoloMontalto
    Sistema di build automation
    ¤ mul5pia4aforma
    ¤ mul5linguaggio
    ¤ mul5proge4o
    ¤ DSL basato su groovy
    ¤ build incrementali
    ¤ notazione compa4a per le dipendenze
    ¤ Usa maven come repository locale/remoto per le dipendenze
    compile 'it.xabaras.android.logger:Logger:1.3.6’
    groupId
    ar5factId
    dependencies {
    }

    View full-size slide

  7. #IOextendedGE16
    PERCHÉ DISTRIBUIRE LIBRERIE?
    +PaoloMontalto
    ¤ Riuso del codice
    ¤ Librerie disponibili online sempre
    ¤ Rendere disponibili versioni aggiornate
    ¤ Certezza della provenienza dei file
    ¤ Maggiore facilità manutenzione
    ¤ Contribuire alla comunità

    View full-size slide

  8. #IOextendedGE16
    MAVEN CENTRAL VS JCENTER
    +PaoloMontalto
    Maven Central
    h4p://search.maven.org
    JCenter
    h4p://jcenter.bintray.com
    repositories {
    mavenCentral()
    }
    repositories {
    jcenter()
    }

    View full-size slide

  9. #IOextendedGE16
    MAVEN CENTRAL VS JCENTER
    +PaoloMontalto
    Maven Central
    h4p://search.maven.org
    JCenter
    h4p://jcenter.bintray.com
    Sonatype
    ¤  Linea di commando
    ¤  Jira ticket
    ¤  cifratura build
    JFrog
    ¤  Web UI
    ¤  semplice da usare (no cifratura)
    ¤  Integrazione con GitHub e BitBucket
    ¤  Sincronizzazione con Maven Central
    ¤  Statistiche di download

    View full-size slide

  10. #IOextendedGE16
    MAVEN CENTRAL VS JCENTER
    +PaoloMontalto
    Maven Central
    h4p://search.maven.org
    JCenter
    h4p://jcenter.bintray.com
    Sonatype
    ¤  Linea di commando
    ¤  Jira ticket
    ¤  cifratura build
    JFrog
    ¤  Web UI
    ¤  semplice da usare (no cifratura)
    ¤  Integrazione con GitHub e BitBucket
    ¤  Sincronizzazione con Maven Central
    ¤  Statistiche di download
    >=
    mavenCentral()

    View full-size slide

  11. #IOextendedGE16
    PUBBLICARE SU JCENTER
    +PaoloMontalto
    ¤ Registrarsi su Bintray
    ¤ Creare un package nel repository maven
    ¤ Configurare il progetto gradle
    ¤ Caricare gli artifact su bintray
    ¤ Sincronizzare il repository con jcenter

    View full-size slide

  12. #IOextendedGE16
    REGISTRARSI SU BINTRAY
    +PaoloMontalto

    View full-size slide

  13. #IOextendedGE16
    PUBBLICARE SU JCENTER
    +PaoloMontalto
    ¤ Registrarsi su Bintray
    ¤ Creare un package nel repository maven
    ¤ Configurare il progetto gradle
    ¤ Caricare gli artifact su bintray
    ¤ Sincronizzare il repository con jcenter

    View full-size slide

  14. #IOextendedGE16
    CREARE UN PACKAGE NEL REPOSITORY MAVEN
    +PaoloMontalto

    View full-size slide

  15. #IOextendedGE16
    CREARE UN PACKAGE NEL REPOSITORY MAVEN 2
    +PaoloMontalto

    View full-size slide

  16. #IOextendedGE16
    PUBBLICARE SU JCENTER
    +PaoloMontalto
    ¤ Registrarsi su Bintray
    ¤ Creare un package nel repository maven
    ¤ Configurare il progetto gradle
    ¤ Caricare gli artifact su bintray
    ¤ Sincronizzare il repository con jcenter

    View full-size slide

  17. #IOextendedGE16
    CONFIGURARE IL PROGETTO GRADLE
    +PaoloMontalto
    ¤  settings.gradle
    apply plugin: 'java’
    group 'it.xabaras.android.logger'
    version '1.3.6’
    jar {
    manifest {
    attributes(
    "Created-By": "Paolo Montalto",
    "Specification-Title": rootProject.name,
    "Implementation-Title": group,
    "Implementation-Version": version
    )
    }
    }
    dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
    ...
    }
    rootProject.name = 'Logger'
    ¤  build.gradle

    View full-size slide

  18. #IOextendedGE16
    CONFIGURARE IL PROGETTO GRADLE 2
    +PaoloMontalto
    ¤  Bintray plugin (build.gradle)
    plugins {
    id "com.jfrog.bintray" version "1.6"
    }
    ¤  local.properties
    bintray.user=xabaras
    bintray.apiKey=abcdefghijklmnopqrstuwxyz1234567890ABCDE

    View full-size slide

  19. #IOextendedGE16
    CONFIGURARE IL PROGETTO GRADLE 3
    +PaoloMontalto
    ¤  build.gradle
    bintray {
    user = properties.getProperty('bintray.user’)
    key = properties.getProperty('bintray.apiKey’)
    configurations = [’archives’]
    publish = true
    pkg {
    repo = 'maven'
    name = 'Logger'
    desc = 'A simple class wrapping android logger introducing some utilities. '
    websiteUrl = 'https://github.com/xabaras/Logger'
    issueTrackerUrl = 'https://github.com/xabaras/Logger/issues'
    vcsUrl = 'https://github.com/xabaras/Logger.git'
    licenses = ['Apache-2.0']
    publicDownloadNumbers = true
    version {
    name = project['version']
    desc = 'Logger ' + project['version']
    }
    }
    }

    View full-size slide

  20. #IOextendedGE16
    CONFIGURARE IL PROGETTO GRADLE 3
    +PaoloMontalto
    ¤  build.gradle
    bintray {
    user = properties.getProperty('bintray.user’)
    key = properties.getProperty('bintray.apiKey’)
    configurations = [’archives’]
    publish = true
    pkg {
    repo = 'maven'
    name = 'Logger'
    desc = 'A simple class wrapping android logger introducing some utilities. '
    websiteUrl = 'https://github.com/xabaras/Logger'
    issueTrackerUrl = 'https://github.com/xabaras/Logger/issues'
    vcsUrl = 'https://github.com/xabaras/Logger.git'
    licenses = ['Apache-2.0']
    publicDownloadNumbers = true
    version {
    name = project['version']
    desc = 'Logger ' + project['version']
    }
    }
    }

    View full-size slide

  21. #IOextendedGE16
    CONFIGURARE IL PROGETTO GRADLE 3
    +PaoloMontalto
    ¤  build.gradle
    bintray {
    user = properties.getProperty('bintray.user’)
    key = properties.getProperty('bintray.apiKey’)
    configurations = [’archives’]
    publish = true
    pkg {
    repo = 'maven'
    name = 'Logger'
    desc = 'A simple class wrapping android logger introducing some utilities. '
    websiteUrl = 'https://github.com/xabaras/Logger'
    issueTrackerUrl = 'https://github.com/xabaras/Logger/issues'
    vcsUrl = 'https://github.com/xabaras/Logger.git'
    licenses = ['Apache-2.0']
    publicDownloadNumbers = true
    version {
    name = project['version']
    desc = 'Logger ' + project['version']
    }
    }
    }

    View full-size slide

  22. #IOextendedGE16
    CONFIGURARE IL PROGETTO GRADLE 3
    +PaoloMontalto
    ¤  build.gradle
    bintray {
    user = properties.getProperty('bintray.user’)
    key = properties.getProperty('bintray.apiKey’)
    configurations = [’archives’]
    publish = true
    pkg {
    repo = 'maven'
    name = 'Logger'
    desc = 'A simple class wrapping android logger introducing some utilities. '
    websiteUrl = 'https://github.com/xabaras/Logger'
    issueTrackerUrl = 'https://github.com/xabaras/Logger/issues'
    vcsUrl = 'https://github.com/xabaras/Logger.git'
    licenses = ['Apache-2.0']
    publicDownloadNumbers = true
    version {
    name = project['version']
    desc = 'Logger ' + project['version']
    }
    }
    }

    View full-size slide

  23. #IOextendedGE16
    CONFIGURARE IL PROGETTO GRADLE 3
    +PaoloMontalto
    ¤  build.gradle
    bintray {
    user = properties.getProperty('bintray.user’)
    key = properties.getProperty('bintray.apiKey’)
    configurations = [’archives’]
    publish = true
    pkg {
    repo = 'maven'
    name = 'Logger'
    desc = 'A simple class wrapping android logger introducing some utilities. '
    websiteUrl = 'https://github.com/xabaras/Logger'
    issueTrackerUrl = 'https://github.com/xabaras/Logger/issues'
    vcsUrl = 'https://github.com/xabaras/Logger.git'
    licenses = ['Apache-2.0']
    publicDownloadNumbers = true
    version {
    name = project['version']
    desc = 'Logger ' + project['version']
    }
    }
    }

    View full-size slide

  24. #IOextendedGE16
    CONFIGURARE IL PROGETTO GRADLE 4
    +PaoloMontalto
    task sourcesJar(type: Jar, dependsOn: classes) {
    classifier = 'sources'
    from sourceSets.main.allSource
    }
    task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.des5na5onDir
    }
    ar5facts {
    archives sourcesJar
    archives javadocJar
    }
    ¤  build.gradle

    View full-size slide

  25. #IOextendedGE16
    PUBBLICARE SU JCENTER
    +PaoloMontalto
    ¤ Registrarsi su Bintray
    ¤ Creare un package nel repository maven
    ¤ Configurare il progetto gradle
    ¤ Caricare gli artifact su bintray
    ¤ Sincronizzare il repository con jcenter

    View full-size slide

  26. #IOextendedGE16
    CARICARE GLI ARTIFACT SU BINTRAY
    +PaoloMontalto

    View full-size slide

  27. #IOextendedGE16
    CARICARE GLI ARTIFACT SU BINTRAY 2
    +PaoloMontalto

    View full-size slide

  28. #IOextendedGE16
    CARICARE GLI ARTIFACT SU BINTRAY 3
    +PaoloMontalto
    La libreria è sul vostro repository maven ma non su jcenter
    repositories {
    maven {
    url 'h4ps://dl.bintray.com/xabaras/maven'
    }
    }
    ...
    dependencies {
    compile 'it.xabaras.android.logger:Logger:1.3.6'
    }

    View full-size slide

  29. #IOextendedGE16
    PUBBLICARE SU JCENTER
    +PaoloMontalto
    ¤ Registrarsi su Bintray
    ¤ Creare un package nel repository maven
    ¤ Configurare il progetto gradle
    ¤ Caricare gli artifact su bintray
    ¤ Sincronizzare il repository con jcenter

    View full-size slide

  30. #IOextendedGE16
    SINCRONIZZARE IL REPOSITORY CON JCENTER
    +PaoloMontalto

    View full-size slide

  31. #IOextendedGE16
    SINCRONIZZARE IL REPOSITORY CON JCENTER
    +PaoloMontalto

    View full-size slide

  32. #IOextendedGE16
    PRONTI AD USARE LA LIBRERIA PUBBLICATA
    +PaoloMontalto
    repositories {
    jcenter()
    }
    dependencies {

    compile 'it.xabaras.android.logger:Logger:1.3.6’

    }

    View full-size slide

  33. #IOextendedGE16
    PUBBLICARE ANCHE SU MAVEN CENTRAL
    +PaoloMontalto
    ¤ Creare un account Sonatype
    ¤ Creare una issue su JIRA
    ¤ Aggiungere lo username Sonatype su Bintray
    ¤ Abilitare l’auto signing delle build su Bintray (coppia chiavi GPG)
    ¤ Configurare il build.gradle
    ¤ Caricare gli artifact su bintray
    ¤ Sincronizzare il repository con Maven Central

    View full-size slide

  34. #IOextendedGE16
    PUBBLICARE ANCHE SU MAVEN CENTRAL 2
    +PaoloMontalto
    ¤ Creare un account Sonatype
    ¤ Creare una issue su JIRA
    ¤ Aggiungere lo username Sonatype su Bintray
    ¤ Abilitare l’auto signing delle build su Bintray (coppia chiavi GPG)
    ¤ Configurare il build.gradle
    ¤ Caricare gli artifact su bintray
    ¤ Sincronizzare il repository con Maven Central

    View full-size slide

  35. #IOextendedGE16
    PUBBLICARE ANCHE SU MAVEN CENTRAL 3
    +PaoloMontalto
    ¤ Creare un account Sonatype
    ¤ Creare una issue su JIRA
    ¤ Aggiungere lo username Sonatype su Bintray
    ¤ Abilitare l’auto signing delle build su Bintray (coppia chiavi GPG)
    ¤ Configurare il build.gradle
    ¤ Caricare gli artifact su bintray
    ¤ Sincronizzare il repository con Maven Central

    View full-size slide

  36. #IOextendedGE16
    PUBBLICARE ANCHE SU MAVEN CENTRAL 4
    +PaoloMontalto
    ¤ Creare un account Sonatype
    ¤ Creare una issue su JIRA
    ¤ Aggiungere lo username Sonatype su Bintray
    ¤ Abilitare l’auto signing delle build su Bintray (coppia chiavi GPG)
    ¤ Configurare il build.gradle
    ¤ Caricare gli artifact su bintray
    ¤ Sincronizzare il repository con Maven Central

    View full-size slide

  37. #IOextendedGE16
    PUBBLICARE ANCHE SU MAVEN CENTRAL 5
    +PaoloMontalto
    ¤ Creare un account Sonatype
    ¤ Creare una issue su JIRA
    ¤ Aggiungere lo username Sonatype su Bintray
    ¤ Abilitare l’auto signing delle build su Bintray (coppia chiavi GPG)
    ¤ Configurare il build.gradle
    ¤ Caricare gli artifact su bintray
    ¤ Sincronizzare il repository con Maven Central

    View full-size slide

  38. #IOextendedGE16
    PUBBLICARE ANCHE SU MAVEN CENTRAL 5
    +PaoloMontalto
    ¤  local.properties
    bintray_gpg_password=LA_MIA_PASSWORD_GPG
    ¤  build.gradle
    bintray {
    configurations = [’archives’]
    publications = ['mavenStuff']
    version {

    gpg {
    sign = true
    passphrase = properties.getProperty('bintray_gpg_password’)
    }
    }

    View full-size slide

  39. #IOextendedGE16
    PUBBLICARE ANCHE SU MAVEN CENTRAL 5
    +PaoloMontalto
    ¤  build.gradle
    publishing {
    publications {
    mavenStuff(MavenPublication) {
    from components.java
    groupId group
    artifactId rootProject.name
    version version
    artifact sourcesJar
    artifact javadocJar
    pom.withXml {
    // package name, description, licenses and developer info
    }
    }
    }
    }

    View full-size slide

  40. #IOextendedGE16
    PUBBLICARE ANCHE SU MAVEN CENTRAL 6
    +PaoloMontalto
    ¤ Creare un account Sonatype
    ¤ Creare una issue su JIRA
    ¤ Aggiungere lo username Sonatype su Bintray
    ¤ Abilitare l’auto signing delle build su Bintray (coppia chiavi GPG)
    ¤ Configurare il build.gradle
    ¤ Caricare gli artifact su bintray
    ¤ Sincronizzare il repository con Maven Central

    View full-size slide

  41. #IOextendedGE16
    PUBBLICARE ANCHE SU MAVEN CENTRAL 7
    +PaoloMontalto
    ¤ Creare un account Sonatype
    ¤ Creare una issue su JIRA
    ¤ Aggiungere lo username Sonatype su Bintray
    ¤ Abilitare l’auto signing delle build su Bintray (coppia chiavi GPG)
    ¤ Configurare il build.gradle
    ¤ Caricare gli artifact su bintray
    ¤ Sincronizzare il repository con Maven Central

    View full-size slide

  42. #IOextendedGE16
    PUBBLICARE UNA LIBRERIA ANDROID
    +PaoloMontalto
    Libreria Java
    jar
    Libreria Android
    ?

    View full-size slide

  43. #IOextendedGE16
    PUBBLICARE UNA LIBRERIA ANDROID
    +PaoloMontalto
    Libreria Java
    jar
    Libreria Android
    aar

    View full-size slide

  44. #IOextendedGE16
    PUBBLICARE UNA LIBRERIA ANDROID 2
    +PaoloMontalto
    Android Archive Library
    ¤  AndroidManifest.xml
    ¤  classi java (classes.jar)
    ¤  risorse (cartella “res”)
    ¤  assets
    ¤  I jar della cartella libs
    ¤  librerie JNI
    ¤  etc.

    View full-size slide

  45. #IOextendedGE16
    PUBBLICARE UNA LIBRERIA ANDROID 3
    +PaoloMontalto
    ¤  local.properties
    bintray.user=xabaras
    bintray.apiKey=abcdefghijklmnopqrstuwxyz1234567890ABCD
    bintray.gpg.password=LA_MIA_PASSWORD_GPG
    dependencies {
    classpath 'com.android.tools.build:gradle:1.1.2+'
    classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4'
    classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
    }
    ¤  build.gradle

    View full-size slide

  46. #IOextendedGE16
    PUBBLICARE UNA LIBRERIA ANDROID 4
    +PaoloMontalto
    apply plugin: 'com.android.library'
    ext {
    bintrayRepo = 'maven'
    bintrayName = ’sliding-menu'
    publishedGroupId = ’it.xabaras.android’
    libraryName = ’SlidingMenu'
    artifact = ’sliding-menu’
    libraryDescription = ’A Facebook like sliding menu for Android apps’
    libraryVersion = '0.1.2'
    developerId = ’xabaras'
    developerName = ’Paolo Montalto'
    developerEmail = ’[email protected]'
    licenseName = 'The Apache Software License, Version 2.0'
    licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
    allLicenses = [‘Apache-2.0’]
    }
    apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/installv1.gradle'
    apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/bintrayv1.gradle'
    ¤  build.gradle

    View full-size slide

  47. #IOextendedGE16
    PUBBLICARE UNA LIBRERIA ANDROID 4
    +PaoloMontalto
    apply plugin: 'com.android.library'
    ext {
    bintrayRepo = 'maven'
    bintrayName = ’sliding-menu'
    publishedGroupId = ’it.xabaras.android’
    libraryName = ’SlidingMenu'
    artifact = ’sliding-menu’
    libraryDescription = ’A Facebook like sliding menu for Android apps’
    libraryVersion = '0.1.2'
    developerId = ’xabaras'
    developerName = ’Paolo Montalto'
    developerEmail = ’[email protected]'
    licenseName = 'The Apache Software License, Version 2.0'
    licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
    allLicenses = [‘Apache-2.0’]
    }
    apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/installv1.gradle'
    apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/bintrayv1.gradle'
    ¤  build.gradle

    View full-size slide

  48. #IOextendedGE16
    PUBBLICARE UNA LIBRERIA ANDROID 5
    +PaoloMontalto
    dependencies {
    compile 'it.xabaras.android:sliding-menu:0.1.2@aar'
    }

    View full-size slide

  49. #IOextendedGE16
    QUALCHE RIFERIMENTO
    +PaoloMontalto
    ¤  How to distribute your own Android library through jCenter and Maven Central from
    Android Studio @TheCheeseFact
    ¤  Distribute your libraries via Maven, even privately @molsjeroen
    ¤  Getting Started Using the Gradle Bintray Plugin bintray/gradle-bintray-plugin

    View full-size slide

  50. #IOextendedGE16 +PaoloMontalto

    View full-size slide

  51. #IOextendedGE16
    GRAZIE PER L’ATTENZIONE
    https://github.com/xabaras/
    http://www.slideshare.net/montypablo
    PAOLO MONTALTO
    http://www.xabaras.it
    https://it.linkedin.com/in/paolomontalto
    Always code as if the guy who
    ends up maintaining your code
    will be a violent psychopath who
    knows where you live.
    John F. Woods
    +PaoloMontalto
    [email protected]

    View full-size slide