$30 off During Our Annual Pro Sale. View Details »

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
  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
  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
  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
  5. #IOextendedGE16 MAVEN +PaoloMontalto <dependency> <groupId>it.xabaras.android.logger</groupId> <artifactId>Logger</artifactId> <version>1.3.6</version> <type>pom</type> </dependency>

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

    h4p://jcenter.bintray.com repositories { mavenCentral() } repositories { jcenter() }
  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
  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()
  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 REGISTRARSI SU BINTRAY +PaoloMontalto

  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
  14. #IOextendedGE16 CREARE UN PACKAGE NEL REPOSITORY MAVEN +PaoloMontalto

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

  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
  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
  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
  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'] } } }
  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'] } } }
  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'] } } }
  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'] } } }
  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'] } } }
  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
  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
  26. #IOextendedGE16 CARICARE GLI ARTIFACT SU BINTRAY +PaoloMontalto

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

  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' }
  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
  30. #IOextendedGE16 SINCRONIZZARE IL REPOSITORY CON JCENTER +PaoloMontalto

  31. #IOextendedGE16 SINCRONIZZARE IL REPOSITORY CON JCENTER +PaoloMontalto

  32. #IOextendedGE16 PRONTI AD USARE LA LIBRERIA PUBBLICATA +PaoloMontalto repositories {

    jcenter() } dependencies { … compile 'it.xabaras.android.logger:Logger:1.3.6’ … }
  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
  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
  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
  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
  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
  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’) } }
  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 } } } }
  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
  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
  42. #IOextendedGE16 PUBBLICARE UNA LIBRERIA ANDROID +PaoloMontalto Libreria Java jar Libreria

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

    Android aar
  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.
  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
  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 = ’p.montalto@xabaras.it' 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
  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 = ’p.montalto@xabaras.it' 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
  48. #IOextendedGE16 PUBBLICARE UNA LIBRERIA ANDROID 5 +PaoloMontalto dependencies { compile

    'it.xabaras.android:sliding-menu:0.1.2@aar' }
  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
  50. #IOextendedGE16 +PaoloMontalto

  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 p.montalto@xabaras.it