distribuire una libreria java per usarla come dipendenza gradle
TRANSCRIPT
#IOextendedGE16
DISTRIBUIRE UNA LIBRERIA JAVA PER USARLA COME DIPENDENZA GRADLE
+PaoloMontalto
#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
#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
#IOextendedGE16
MAVEN
+PaoloMontalto
Forse il più noto sistema di build automation ¤ consentedidefinireilciclodivitadiunprocessodibuild¤ definisceledipendenzedelproge4o¤ filediconfigurazionebasa5suXML¤ repositorydilibrerie
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
#IOextendedGE16
MAVEN
+PaoloMontalto
<dependency> <groupId>it.xabaras.android.logger</groupId> <artifactId>Logger</artifactId> <version>1.3.6</version> <type>pom</type> </dependency>
version
#IOextendedGE16
GRADLE
+PaoloMontalto
Sistema di build automation
¤ mul5pia4aforma¤ mul5linguaggio¤ mul5proge4o¤ DSLbasatosugroovy¤ buildincrementali
¤ notazionecompa4aperledipendenze¤ Usamavencomerepositorylocale/remotoperledipendenze
compile 'i t .xabaras.android. logger :Logger :1.3.6’ groupId
ar5factIddependencies {
}
#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à
#IOextendedGE16
MAVEN CENTRAL VS JCENTER
+PaoloMontalto
MavenCentralh4p://search.maven.org
JCenterh4p://jcenter.bintray.com
repositories { mavenCentral()
}
repositories { jcenter()
}
#IOextendedGE16
MAVEN CENTRAL VS JCENTER
+PaoloMontalto
MavenCentralh4p://search.maven.org
JCenterh4p://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
#IOextendedGE16
MAVEN CENTRAL VS JCENTER
+PaoloMontalto
MavenCentralh4p://search.maven.org
JCenterh4p://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()
#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
#IOextendedGE16
REGISTRARSI SU BINTRAY
+PaoloMontalto
#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
#IOextendedGE16
CREARE UN PACKAGE NEL REPOSITORY MAVEN
+PaoloMontalto
#IOextendedGE16
CREARE UN PACKAGE NEL REPOSITORY MAVEN 2
+PaoloMontalto
#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
#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
#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
#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'] } } }
#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'] } } }
#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'] } } }
#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'] } } }
#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'] } } }
#IOextendedGE16
CONFIGURARE IL PROGETTO GRADLE 4
+PaoloMontalto
tasksourcesJar(type:Jar,dependsOn:classes){classifier='sources'fromsourceSets.main.allSource}taskjavadocJar(type:Jar,dependsOn:javadoc){classifier='javadoc'fromjavadoc.des5na5onDir}ar5facts{archivessourcesJararchivesjavadocJar}
¤ build.gradle
#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
#IOextendedGE16
CARICARE GLI ARTIFACT SU BINTRAY
+PaoloMontalto
#IOextendedGE16
CARICARE GLI ARTIFACT SU BINTRAY 2
+PaoloMontalto
#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'}
#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
#IOextendedGE16
SINCRONIZZARE IL REPOSITORY CON JCENTER
+PaoloMontalto
#IOextendedGE16
SINCRONIZZARE IL REPOSITORY CON JCENTER
+PaoloMontalto
#IOextendedGE16
PRONTI AD USARE LA LIBRERIA PUBBLICATA
+PaoloMontalto
repositories { jcenter()
} dependencies {
… compile 'it.xabaras.android.logger:Logger:1.3.6’ …
}
#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
#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
#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
#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
#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
#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 =truepassphrase = properties.getProperty('bintray_gpg_password’) } }
#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 } } } }
#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
#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
#IOextendedGE16
PUBBLICARE UNA LIBRERIA ANDROID
+PaoloMontalto
LibreriaJava
jar
LibreriaAndroid
?
#IOextendedGE16
PUBBLICARE UNA LIBRERIA ANDROID
+PaoloMontalto
LibreriaJava
jar
LibreriaAndroid
aar
#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.
#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
#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
#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
#IOextendedGE16
PUBBLICARE UNA LIBRERIA ANDROID 5
+PaoloMontalto
dependencies{compile'it.xabaras.android:sliding-menu:0.1.2@aar'}
#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
#IOextendedGE16 +PaoloMontalto
#IOextendedGE16
GRAZIE PER L’ATTENZIONE
https://github.com/xabaras/
http://www.slideshare.net/montypablo
PAOLOMONTALTO
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