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

Distribuire una libreria java per usarla come d...

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 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
  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 build automation
  3. #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
  4. 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 { }
  5. #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à
  6. #IOextendedGE16 MAVEN CENTRAL VS JCENTER +PaoloMontalto Maven Central h4p://search.maven.org JCenter

    h4p://jcenter.bintray.com repositories { mavenCentral() } repositories { jcenter() }
  7. #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
  8. #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()
  9. #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
  10. #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
  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
  12. #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
  13. #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
  14. #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'] } } }
  15. #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'] } } }
  16. #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'] } } }
  17. #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'] } } }
  18. #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'] } } }
  19. #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
  20. #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
  21. #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' }
  22. #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
  23. #IOextendedGE16 PRONTI AD USARE LA LIBRERIA PUBBLICATA +PaoloMontalto repositories {

    jcenter() } dependencies { … compile 'it.xabaras.android.logger:Logger:1.3.6’ … }
  24. #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
  25. #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
  26. #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
  27. #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
  28. #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
  29. #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’) } }
  30. #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 } } } }
  31. #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
  32. #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
  33. #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.
  34. #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
  35. #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
  36. #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
  37. #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
  38. #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]