Slide 1

Slide 1 text

DISTRIBUTE TO A PRIVATE OR PUBLIC MAVEN REPOSITORY @MOLSJEROEN

Slide 2

Slide 2 text

BEFORE SOFTWARE CAN BE REUSABLE IT FIRST HAS TO BE USABLE. Ralph Johnson

Slide 3

Slide 3 text

MAVEN FUNDAMENTALS

Slide 4

Slide 4 text

@MOLSJEROEN WHAT IS MAVEN

Slide 5

Slide 5 text

@MOLSJEROEN HOW MAVEN STORES ARTIFACTS ▸ Artifacts: artifact.aar, javadoc.jar, sources.jar,… ▸ Project Object Model ▸ GroupId ▸ ArtifactId ▸ Version

Slide 6

Slide 6 text

@MOLSJEROEN GRADLE - CONSUME ARTIFACTS allprojects {
 repositories {
 jcenter()
 maven { url “http://mywebsite.com/mavenrepository" }
 }
 } dependencies {
 compile fileTree(dir: 'libs', include: ['*.jar'])
 compile ‘com.android.support:appcompat-v7:23.1.0’ 
 compile ‘com.jakewharton:butterknife:7.0.1'
 }

Slide 7

Slide 7 text

@MOLSJEROEN GRADLE - CONSUME ARTIFACTS allprojects {
 repositories {
 jcenter()
 maven { url “http://mywebsite.com/mavenrepository" }
 }
 } dependencies {
 compile fileTree(dir: 'libs', include: ['*.jar'])
 compile ‘com.android.support:appcompat-v7:23.1.0’ 
 compile ‘com.jakewharton:butterknife:7.0.1'
 }

Slide 8

Slide 8 text

@MOLSJEROEN GRADLE - CONSUME ARTIFACTS allprojects {
 repositories {
 jcenter()
 maven { url “http://mywebsite.com/mavenrepository" }
 }
 } dependencies {
 compile fileTree(dir: 'libs', include: ['*.jar'])
 compile ‘com.android.support:appcompat-v7:23.1.0’ 
 compile ‘com.jakewharton:butterknife:7.0.1'
 }

Slide 9

Slide 9 text

@MOLSJEROEN GRADLE - CONSUME ARTIFACTS allprojects {
 repositories {
 jcenter()
 maven { url “http://mywebsite.com/mavenrepository" }
 }
 } dependencies {
 compile fileTree(dir: 'libs', include: ['*.jar'])
 compile ‘com.android.support:appcompat-v7:23.1.0’ 
 compile ‘com.jakewharton:butterknife:7.0.1'
 }

Slide 10

Slide 10 text

@MOLSJEROEN GRADLE - CONSUME ARTIFACTS allprojects {
 repositories {
 jcenter()
 maven { url “http://mywebsite.com/mavenrepository" }
 }
 } dependencies {
 compile fileTree(dir: 'libs', include: ['*.jar'])
 compile ‘com.android.support:appcompat-v7:23.1.0’ 
 compile ‘com.jakewharton:butterknife:7.0.1'
 }

Slide 11

Slide 11 text

@MOLSJEROEN GRADLE - CONSUME ARTIFACTS allprojects {
 repositories {
 jcenter()
 maven { url “http://mywebsite.com/mavenrepository" }
 }
 } dependencies {
 compile fileTree(dir: 'libs', include: ['*.jar'])
 compile ‘com.android.support:appcompat-v7:23.1.0’ 
 compile ‘com.jakewharton:butterknife:7.0.1'
 } GroupId ArtifactId Version

Slide 12

Slide 12 text

@MOLSJEROEN GRADLE - UPLOAD ARTIFACTS apply plugin: ‘maven' uploadArchives {
 repositories {
 mavenDeployer {
 repository(url: 'http://mywebsite/mavenrepository') {
 authentication(userName: 'myUsername', password: 'myPassword')
 }
 
 pom.project {
 groupId = ‘packageName’ artifactId = 'libraryName'
 version = 'libraryVersion'
 packaging = 'aar'
 } } } }

Slide 13

Slide 13 text

@MOLSJEROEN GRADLE - UPLOAD ARTIFACTS apply plugin: ‘maven' uploadArchives {
 repositories {
 mavenDeployer {
 repository(url: 'http://mywebsite/mavenrepository') {
 authentication(userName: 'myUsername', password: 'myPassword')
 }
 
 pom.project {
 groupId = ‘packageName’ artifactId = 'libraryName'
 version = 'libraryVersion'
 packaging = 'aar'
 } } } }

Slide 14

Slide 14 text

@MOLSJEROEN GRADLE - UPLOAD ARTIFACTS apply plugin: ‘maven' uploadArchives {
 repositories {
 mavenDeployer {
 repository(url: 'http://mywebsite/mavenrepository') {
 authentication(userName: 'myUsername', password: 'myPassword')
 }
 
 pom.project {
 groupId = ‘packageName’ artifactId = 'libraryName'
 version = 'libraryVersion'
 packaging = 'aar'
 } } } }

Slide 15

Slide 15 text

@MOLSJEROEN GRADLE - UPLOAD ARTIFACTS apply plugin: ‘maven' uploadArchives {
 repositories {
 mavenDeployer {
 repository(url: 'http://mywebsite/mavenrepository') {
 authentication(userName: 'myUsername', password: 'myPassword')
 }
 
 pom.project {
 groupId = ‘packageName’ artifactId = 'libraryName'
 version = 'libraryVersion'
 packaging = 'aar'
 } } } }

Slide 16

Slide 16 text

THERE IS AN EASY WAY AND A HARD WAY. THE HARD PART IS FINDING THE EASY WAY. Dr. Lloyd

Slide 17

Slide 17 text

PUBLIC DISTRIBUTION

Slide 18

Slide 18 text

@MOLSJEROEN PUBLIC MAVEN REPOSITORIES repositories {
 jcenter()
 } ‣ Bintray ‣ Browse repository repositories {
 mavenCentral()
 } ‣ Sonatype ‣ Browse repository

Slide 19

Slide 19 text

@MOLSJEROEN NEXUS ▸ Cumbersome to set up ▸ Register and log a Jira issue ▸ Configure GnuGP to sign artifacts ▸ Upload to staging environment via Gradle ▸ Manually release the artifacts ▸ Wait for sync to Maven Central

Slide 20

Slide 20 text

@MOLSJEROEN

Slide 21

Slide 21 text

@MOLSJEROEN

Slide 22

Slide 22 text

@MOLSJEROEN NEXUS - UPLOAD ARTIFACTS 1 ‣ USER_HOME/.gradle/gradle.properties NEXUS_USERNAME=molsjeroen
 NEXUS_PASSWORD=g00dtry
 
 signing.keyId=ABCDEF12
 signing.password=n1c3try
 signing.secretKeyRingFile=~/.gnupg/secring.gpg

Slide 23

Slide 23 text

@MOLSJEROEN NEXUS - UPLOAD ARTIFACTS 1 ‣ USER_HOME/.gradle/gradle.properties NEXUS_USERNAME=molsjeroen
 NEXUS_PASSWORD=g00dtry
 
 signing.keyId=ABCDEF12
 signing.password=n1c3try
 signing.secretKeyRingFile=~/.gnupg/secring.gpg

Slide 24

Slide 24 text

@MOLSJEROEN NEXUS - UPLOAD ARTIFACTS 1 ‣ USER_HOME/.gradle/gradle.properties NEXUS_USERNAME=molsjeroen
 NEXUS_PASSWORD=g00dtry
 
 signing.keyId=ABCDEF12
 signing.password=n1c3try
 signing.secretKeyRingFile=~/.gnupg/secring.gpg

Slide 25

Slide 25 text

@MOLSJEROEN NEXUS - UPLOAD ARTIFACTS 2 ‣ PROJECT_HOME/gradle.properties VERSION_NAME=1.0.7
 VERSION_CODE=5
 GROUP=com.github.jeroenmols
 
 POM_DESCRIPTION=Powerful custom Android Camera.
 POM_URL=https://github.com/JeroenMols/LandscapeVideoCamera
 POM_SCM_URL=https://github.com/JeroenMols/LandscapeVideoCamera
 POM_SCM_CONNECTION=scm:[email protected]:JeroenMols/LandscapeVideoCamera.git
 POM_SCM_DEV_CONNECTION=scm:[email protected]:JeroenMols/LandscapeVideo… 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=JeroenMols
 POM_DEVELOPER_NAME=Jeroen Mols

Slide 26

Slide 26 text

@MOLSJEROEN NEXUS - UPLOAD ARTIFACTS 2 ‣ PROJECT_HOME/gradle.properties VERSION_NAME=1.0.7
 VERSION_CODE=5
 GROUP=com.github.jeroenmols
 
 POM_DESCRIPTION=Powerful custom Android Camera.
 POM_URL=https://github.com/JeroenMols/LandscapeVideoCamera
 POM_SCM_URL=https://github.com/JeroenMols/LandscapeVideoCamera
 POM_SCM_CONNECTION=scm:[email protected]:JeroenMols/LandscapeVideoCamera.git
 POM_SCM_DEV_CONNECTION=scm:[email protected]:JeroenMols/LandscapeVideo… 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=JeroenMols
 POM_DEVELOPER_NAME=Jeroen Mols

Slide 27

Slide 27 text

@MOLSJEROEN NEXUS - UPLOAD ARTIFACTS 2 ‣ PROJECT_HOME/gradle.properties VERSION_NAME=1.0.7
 VERSION_CODE=5
 GROUP=com.github.jeroenmols
 
 POM_DESCRIPTION=Powerful custom Android Camera.
 POM_URL=https://github.com/JeroenMols/LandscapeVideoCamera
 POM_SCM_URL=https://github.com/JeroenMols/LandscapeVideoCamera
 POM_SCM_CONNECTION=scm:[email protected]:JeroenMols/LandscapeVideoCamera.git
 POM_SCM_DEV_CONNECTION=scm:[email protected]:JeroenMols/LandscapeVideo… 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=JeroenMols
 POM_DEVELOPER_NAME=Jeroen Mols

Slide 28

Slide 28 text

@MOLSJEROEN NEXUS - UPLOAD ARTIFACTS 2 ‣ PROJECT_HOME/gradle.properties VERSION_NAME=1.0.7
 VERSION_CODE=5
 GROUP=com.github.jeroenmols
 
 POM_DESCRIPTION=Powerful custom Android Camera.
 POM_URL=https://github.com/JeroenMols/LandscapeVideoCamera
 POM_SCM_URL=https://github.com/JeroenMols/LandscapeVideoCamera
 POM_SCM_CONNECTION=scm:[email protected]:JeroenMols/LandscapeVideoCamera.git
 POM_SCM_DEV_CONNECTION=scm:[email protected]:JeroenMols/LandscapeVideo… 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=JeroenMols
 POM_DEVELOPER_NAME=Jeroen Mols

Slide 29

Slide 29 text

@MOLSJEROEN NEXUS - UPLOAD ARTIFACTS 2 ‣ PROJECT_HOME/gradle.properties VERSION_NAME=1.0.7
 VERSION_CODE=5
 GROUP=com.github.jeroenmols
 
 POM_DESCRIPTION=Powerful custom Android Camera.
 POM_URL=https://github.com/JeroenMols/LandscapeVideoCamera
 POM_SCM_URL=https://github.com/JeroenMols/LandscapeVideoCamera
 POM_SCM_CONNECTION=scm:[email protected]:JeroenMols/LandscapeVideoCamera.git
 POM_SCM_DEV_CONNECTION=scm:[email protected]:JeroenMols/LandscapeVideo… 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=JeroenMols
 POM_DEVELOPER_NAME=Jeroen Mols

Slide 30

Slide 30 text

@MOLSJEROEN NEXUS - UPLOAD ARTIFACTS 2 ‣ PROJECT_HOME/gradle.properties VERSION_NAME=1.0.7
 VERSION_CODE=5
 GROUP=com.github.jeroenmols
 
 POM_DESCRIPTION=Powerful custom Android Camera.
 POM_URL=https://github.com/JeroenMols/LandscapeVideoCamera
 POM_SCM_URL=https://github.com/JeroenMols/LandscapeVideoCamera
 POM_SCM_CONNECTION=scm:[email protected]:JeroenMols/LandscapeVideoCamera.git
 POM_SCM_DEV_CONNECTION=scm:[email protected]:JeroenMols/LandscapeVideo… 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=JeroenMols
 POM_DEVELOPER_NAME=Jeroen Mols

Slide 31

Slide 31 text

@MOLSJEROEN NEXUS - UPLOAD ARTIFACTS 3 ‣ MODULE_HOME/build.gradle apply from: 'https://raw.github.com/chrisbanes/ gradle-mvn-push/master/gradle-mvn-push.gradle' ‣ $ ./gradlew clean build uploadArchives

Slide 32

Slide 32 text

@MOLSJEROEN NEXUS - UPLOAD ARTIFACTS 3 ‣ MODULE_HOME/build.gradle apply from: 'https://raw.github.com/chrisbanes/ gradle-mvn-push/master/gradle-mvn-push.gradle' ‣ $ ./gradlew clean build uploadArchives

Slide 33

Slide 33 text

@MOLSJEROEN NEXUS - UPLOAD ARTIFACTS 3 ‣ MODULE_HOME/build.gradle apply from: 'https://raw.github.com/chrisbanes/ gradle-mvn-push/master/gradle-mvn-push.gradle' ‣ $ ./gradlew clean build uploadArchives

Slide 34

Slide 34 text

@MOLSJEROEN

Slide 35

Slide 35 text

@MOLSJEROEN BINTRAY ▸ Quite easy to set up ▸ Create account and new package ▸ No signing needed ▸ Gradle or manual upload to staging ▸ Manually release the artifacts ▸ Wait for sync to JCenter

Slide 36

Slide 36 text

@MOLSJEROEN

Slide 37

Slide 37 text

@MOLSJEROEN

Slide 38

Slide 38 text

@MOLSJEROEN BINTRAY - UPLOAD ARTIFACTS 1 ‣ PROJECT_HOME/local.properties bintray.user=jeroenmols
 bintray.apikey=n1c3try ‣ PROJECT_HOME/build.gradle buildscript {
 dependencies {
 classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2'
 classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
 }
 }

Slide 39

Slide 39 text

@MOLSJEROEN BINTRAY - UPLOAD ARTIFACTS 1 ‣ PROJECT_HOME/local.properties bintray.user=jeroenmols
 bintray.apikey=n1c3try ‣ PROJECT_HOME/build.gradle buildscript {
 dependencies {
 classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2'
 classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
 }
 }

Slide 40

Slide 40 text

@MOLSJEROEN BINTRAY - UPLOAD ARTIFACTS 1 ‣ PROJECT_HOME/local.properties bintray.user=jeroenmols
 bintray.apikey=n1c3try ‣ PROJECT_HOME/build.gradle buildscript {
 dependencies {
 classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2'
 classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
 }
 }

Slide 41

Slide 41 text

@MOLSJEROEN BINTRAY - UPLOAD ARTIFACTS 2 ‣ PROJECT_HOME/local.properties ext {
 bintrayRepo = 'maven'
 bintrayName = 'LandscapeVideoCamera'
 
 publishedGroupId = 'com.github.jeroenmols'
 libraryName = 'LandscapeVideoCamera'
 artifact = 'library'
 
 libraryDescription = 'Powerful custom Android Camera.’ libraryVersion = '1.1.4'
 
 developerId = 'JeroenMols'
 developerName = 'Jeroen Mols'
 developerEmail = '[email protected]'
 
 user = 'jmols'
 apikey = '1a7704b39d7b4c884651c74475abb4fd80e47da3'
 } 
 apply from: 'https://raw.githubusercontent.com/attwellBrian/JCenter/master/installv1.gradle'
 apply from: 'https://raw.githubusercontent.com/attwellBrian/JCenter/master/bintrayv1.gradle'

Slide 42

Slide 42 text

@MOLSJEROEN BINTRAY - UPLOAD ARTIFACTS 2 ‣ PROJECT_HOME/local.properties ext {
 bintrayRepo = 'maven'
 bintrayName = 'LandscapeVideoCamera'
 
 publishedGroupId = 'com.github.jeroenmols'
 libraryName = 'LandscapeVideoCamera'
 artifact = 'library'
 
 libraryDescription = 'Powerful custom Android Camera.’ libraryVersion = '1.1.4'
 
 developerId = 'JeroenMols'
 developerName = 'Jeroen Mols'
 developerEmail = '[email protected]'
 
 user = 'jmols'
 apikey = '1a7704b39d7b4c884651c74475abb4fd80e47da3'
 } 
 apply from: 'https://raw.githubusercontent.com/attwellBrian/JCenter/master/installv1.gradle'
 apply from: 'https://raw.githubusercontent.com/attwellBrian/JCenter/master/bintrayv1.gradle'

Slide 43

Slide 43 text

@MOLSJEROEN BINTRAY - UPLOAD ARTIFACTS 2 ‣ PROJECT_HOME/local.properties ext {
 bintrayRepo = 'maven'
 bintrayName = 'LandscapeVideoCamera'
 
 publishedGroupId = 'com.github.jeroenmols'
 libraryName = 'LandscapeVideoCamera'
 artifact = 'library'
 
 libraryDescription = 'Powerful custom Android Camera.’ libraryVersion = '1.1.4'
 
 developerId = 'JeroenMols'
 developerName = 'Jeroen Mols'
 developerEmail = '[email protected]'
 
 user = 'jmols'
 apikey = '1a7704b39d7b4c884651c74475abb4fd80e47da3'
 } 
 apply from: 'https://raw.githubusercontent.com/attwellBrian/JCenter/master/installv1.gradle'
 apply from: 'https://raw.githubusercontent.com/attwellBrian/JCenter/master/bintrayv1.gradle'

Slide 44

Slide 44 text

@MOLSJEROEN BINTRAY - UPLOAD ARTIFACTS 2 ‣ PROJECT_HOME/local.properties ext {
 bintrayRepo = 'maven'
 bintrayName = 'LandscapeVideoCamera'
 
 publishedGroupId = 'com.github.jeroenmols'
 libraryName = 'LandscapeVideoCamera'
 artifact = 'library'
 
 libraryDescription = 'Powerful custom Android Camera.’ libraryVersion = '1.1.4'
 
 developerId = 'JeroenMols'
 developerName = 'Jeroen Mols'
 developerEmail = '[email protected]'
 
 user = 'jmols'
 apikey = '1a7704b39d7b4c884651c74475abb4fd80e47da3'
 } 
 apply from: 'https://raw.githubusercontent.com/attwellBrian/JCenter/master/installv1.gradle'
 apply from: 'https://raw.githubusercontent.com/attwellBrian/JCenter/master/bintrayv1.gradle'

Slide 45

Slide 45 text

@MOLSJEROEN BINTRAY - UPLOAD ARTIFACTS 2 ‣ PROJECT_HOME/local.properties ext {
 bintrayRepo = 'maven'
 bintrayName = 'LandscapeVideoCamera'
 
 publishedGroupId = 'com.github.jeroenmols'
 libraryName = 'LandscapeVideoCamera'
 artifact = 'library'
 
 libraryDescription = 'Powerful custom Android Camera.’ libraryVersion = '1.1.4'
 
 developerId = 'JeroenMols'
 developerName = 'Jeroen Mols'
 developerEmail = '[email protected]'
 
 user = 'jmols'
 apikey = '1a7704b39d7b4c884651c74475abb4fd80e47da3'
 } 
 apply from: 'https://raw.githubusercontent.com/attwellBrian/JCenter/master/installv1.gradle'
 apply from: 'https://raw.githubusercontent.com/attwellBrian/JCenter/master/bintrayv1.gradle'

Slide 46

Slide 46 text

@MOLSJEROEN BINTRAY - UPLOAD ARTIFACTS 2 ‣ PROJECT_HOME/local.properties ext {
 bintrayRepo = 'maven'
 bintrayName = 'LandscapeVideoCamera'
 
 publishedGroupId = 'com.github.jeroenmols'
 libraryName = 'LandscapeVideoCamera'
 artifact = 'library'
 
 libraryDescription = 'Powerful custom Android Camera.’ libraryVersion = '1.1.4'
 
 developerId = 'JeroenMols'
 developerName = 'Jeroen Mols'
 developerEmail = '[email protected]'
 
 user = 'jmols'
 apikey = '1a7704b39d7b4c884651c74475abb4fd80e47da3'
 } 
 apply from: 'https://raw.githubusercontent.com/attwellBrian/JCenter/master/installv1.gradle'
 apply from: 'https://raw.githubusercontent.com/attwellBrian/JCenter/master/bintrayv1.gradle'

Slide 47

Slide 47 text

@MOLSJEROEN BINTRAY - UPLOAD ARTIFACTS 2 ‣ PROJECT_HOME/local.properties ext {
 bintrayRepo = 'maven'
 bintrayName = 'LandscapeVideoCamera'
 
 publishedGroupId = 'com.github.jeroenmols'
 libraryName = 'LandscapeVideoCamera'
 artifact = 'library'
 
 libraryDescription = 'Powerful custom Android Camera.’ libraryVersion = '1.1.4'
 
 developerId = 'JeroenMols'
 developerName = 'Jeroen Mols'
 developerEmail = '[email protected]'
 
 user = 'jmols'
 apikey = '1a7704b39d7b4c884651c74475abb4fd80e47da3'
 } 
 apply from: 'https://raw.githubusercontent.com/attwellBrian/JCenter/master/installv1.gradle'
 apply from: 'https://raw.githubusercontent.com/attwellBrian/JCenter/master/bintrayv1.gradle'

Slide 48

Slide 48 text

@MOLSJEROEN BINTRAY - UPLOAD ARTIFACTS 3 ‣ $ ./gradlew bintrayUpload

Slide 49

Slide 49 text

@MOLSJEROEN

Slide 50

Slide 50 text

@MOLSJEROEN JITPACK.IO ▸ Extremely easy to use ▸ No account or set up required ▸ No signing required ▸ No upload to staging required ▸ Builds any GitHub project (and more)

Slide 51

Slide 51 text

@MOLSJEROEN JITPACK.IO - CONSUME ARTIFACTS ‣ PROJECT_HOME/build.gradle allprojects {
 repositories {
 jcenter()
 maven { url "https://jitpack.io" }
 } } ‣ MODULE_HOME/build.gradle dependencies {
 compile 'com.github.JeroenMols:LandscapeVideoCamera:1.1.1'
 }

Slide 52

Slide 52 text

@MOLSJEROEN JITPACK.IO - CONSUME ARTIFACTS ‣ PROJECT_HOME/build.gradle allprojects {
 repositories {
 jcenter()
 maven { url "https://jitpack.io" }
 } } ‣ MODULE_HOME/build.gradle dependencies {
 compile 'com.github.JeroenMols:LandscapeVideoCamera:1.1.1'
 }

Slide 53

Slide 53 text

@MOLSJEROEN JITPACK.IO - CONSUME ARTIFACTS ‣ PROJECT_HOME/build.gradle allprojects {
 repositories {
 jcenter()
 maven { url "https://jitpack.io" }
 } } ‣ MODULE_HOME/build.gradle dependencies {
 compile 'com.github.JeroenMols:LandscapeVideoCamera:1.1.1'
 }

Slide 54

Slide 54 text

@MOLSJEROEN JITPACK.IO - CONSUME ARTIFACTS ‣ PROJECT_HOME/build.gradle allprojects {
 repositories {
 jcenter()
 maven { url "https://jitpack.io" }
 } } ‣ MODULE_HOME/build.gradle dependencies {
 compile ‘com.github.JeroenMols:LandscapeVideoCamera: 3f900ec00b302f75f3d377cff0bdca37145fc89d'
 }

Slide 55

Slide 55 text

I THINK, FUNDAMENTALLY, OPEN SOURCE DOES TEND TO BE MORE STABLE SOFTWARE. Linus Torvalds

Slide 56

Slide 56 text

PRIVATE DISTRIBUTION

Slide 57

Slide 57 text

@MOLSJEROEN REPOSITORY MANAGER - ARTIFACTORY ▸ Easy to set up Maven repository ▸ Cache remote repository artifacts ▸ Open source (free) ▸ Gradle plugin to do the upload ▸ Advanced features ▸ Backups? ▸ Cost/hassle of running a server?

Slide 58

Slide 58 text

@MOLSJEROEN

Slide 59

Slide 59 text

@MOLSJEROEN ARTIFACTORY - UPLOAD ARTIFACTS 1 ‣ PROJECT_HOME/build.gradle buildscript {
 dependencies { classpath “org.jfrog.buildinfo: build-info-extractor-gradle:3.1.1"
 }
 }

Slide 60

Slide 60 text

@MOLSJEROEN ARTIFACTORY - UPLOAD ARTIFACTS 1 ‣ PROJECT_HOME/build.gradle buildscript {
 dependencies { classpath “org.jfrog.buildinfo: build-info-extractor-gradle:3.1.1"
 }
 }

Slide 61

Slide 61 text

@MOLSJEROEN ARTIFACTORY - UPLOAD ARTIFACTS 2 ‣ MODULE_HOME/build.gradle apply plugin: 'com.jfrog.artifactory'
 apply plugin: 'maven-publish' def packageName = 'com.jeroenmols.awesomelibrary'
 def libraryVersion = '1.0.0' publishing {
 publications {
 aar(MavenPublication) {
 groupId = packageName
 version = libraryVersion
 artifactId = project.getName()
 artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")
 } } }

Slide 62

Slide 62 text

@MOLSJEROEN ARTIFACTORY - UPLOAD ARTIFACTS 2 ‣ MODULE_HOME/build.gradle apply plugin: 'com.jfrog.artifactory'
 apply plugin: 'maven-publish' def packageName = 'com.jeroenmols.awesomelibrary'
 def libraryVersion = '1.0.0' publishing {
 publications {
 aar(MavenPublication) {
 groupId = packageName
 version = libraryVersion
 artifactId = project.getName()
 artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")
 } } }

Slide 63

Slide 63 text

@MOLSJEROEN ARTIFACTORY - UPLOAD ARTIFACTS 2 ‣ MODULE_HOME/build.gradle apply plugin: 'com.jfrog.artifactory'
 apply plugin: 'maven-publish' def packageName = 'com.jeroenmols.awesomelibrary'
 def libraryVersion = '1.0.0' publishing {
 publications {
 aar(MavenPublication) {
 groupId = packageName
 version = libraryVersion
 artifactId = project.getName()
 artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")
 } } }

Slide 64

Slide 64 text

@MOLSJEROEN ARTIFACTORY - UPLOAD ARTIFACTS 2 ‣ MODULE_HOME/build.gradle apply plugin: 'com.jfrog.artifactory'
 apply plugin: 'maven-publish' def packageName = 'com.jeroenmols.awesomelibrary'
 def libraryVersion = '1.0.0' publishing {
 publications {
 aar(MavenPublication) {
 groupId = packageName
 version = libraryVersion
 artifactId = project.getName()
 artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")
 } } }

Slide 65

Slide 65 text

@MOLSJEROEN ARTIFACTORY - UPLOAD ARTIFACTS 2 ‣ MODULE_HOME/build.gradle apply plugin: 'com.jfrog.artifactory'
 apply plugin: 'maven-publish' def packageName = 'com.jeroenmols.awesomelibrary'
 def libraryVersion = '1.0.0' publishing {
 publications {
 aar(MavenPublication) {
 groupId = packageName
 version = libraryVersion
 artifactId = project.getName()
 artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")
 } } }

Slide 66

Slide 66 text

@MOLSJEROEN ARTIFACTORY - UPLOAD ARTIFACTS 2 ‣ MODULE_HOME/build.gradle apply plugin: 'com.jfrog.artifactory'
 apply plugin: 'maven-publish' def packageName = 'com.jeroenmols.awesomelibrary'
 def libraryVersion = '1.0.0' publishing {
 publications {
 aar(MavenPublication) {
 groupId = packageName
 version = libraryVersion
 artifactId = project.getName()
 artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")
 } } }

Slide 67

Slide 67 text

@MOLSJEROEN ARTIFACTORY - UPLOAD ARTIFACTS 3 ‣ MODULE_HOME/build.gradle artifactory {
 contextUrl = 'http://localhost:8081/artifactory'
 publish {
 repository {
 repoKey = 'libs-release-local'
 username = "admin"
 password = "password"
 }
 defaults {
 publications('aar')
 publishArtifacts = true
 publishPom = true
 }
 } }

Slide 68

Slide 68 text

@MOLSJEROEN ARTIFACTORY - UPLOAD ARTIFACTS 3 ‣ MODULE_HOME/build.gradle artifactory {
 contextUrl = 'http://localhost:8081/artifactory'
 publish {
 repository {
 repoKey = 'libs-release-local'
 username = "admin"
 password = "password"
 }
 defaults {
 publications('aar')
 publishArtifacts = true
 publishPom = true
 }
 } }

Slide 69

Slide 69 text

@MOLSJEROEN ARTIFACTORY - UPLOAD ARTIFACTS 3 ‣ MODULE_HOME/build.gradle artifactory {
 contextUrl = 'http://localhost:8081/artifactory'
 publish {
 repository {
 repoKey = 'libs-release-local'
 username = "admin"
 password = "password"
 }
 defaults {
 publications('aar')
 publishArtifacts = true
 publishPom = true
 }
 } }

Slide 70

Slide 70 text

@MOLSJEROEN ARTIFACTORY - UPLOAD ARTIFACTS 3 ‣ MODULE_HOME/build.gradle artifactory {
 contextUrl = 'http://localhost:8081/artifactory'
 publish {
 repository {
 repoKey = 'libs-release-local'
 username = "admin"
 password = "password"
 }
 defaults {
 publications('aar')
 publishArtifacts = true
 publishPom = true
 }
 } }

Slide 71

Slide 71 text

@MOLSJEROEN ARTIFACTORY - UPLOAD ARTIFACTS 4 ▸ $ gradle assembleRelease artifactoryPublish

Slide 72

Slide 72 text

@MOLSJEROEN ARTIFACTORY - CONSUME ARTIFACTS ‣ PROJECT_HOME/build.gradle allprojects {
 repositories {
 maven { url “http://localhost:8081/artifactory/libs-release-local" } } } ‣ PROJECT_HOME/build.gradle dependencies {
 compile 'com.jeroenmols.awesomelibrary:1.0.0'
 }

Slide 73

Slide 73 text

@MOLSJEROEN ARTIFACTORY - CONSUME ARTIFACTS ‣ PROJECT_HOME/build.gradle allprojects {
 repositories {
 maven { url “http://localhost:8081/artifactory/libs-release-local" } } } ‣ PROJECT_HOME/build.gradle dependencies {
 compile 'com.jeroenmols.awesomelibrary:1.0.0'
 }

Slide 74

Slide 74 text

@MOLSJEROEN ARTIFACTORY - CONSUME ARTIFACTS ‣ PROJECT_HOME/build.gradle allprojects {
 repositories {
 maven { url “http://localhost:8081/artifactory/libs-release-local" } } } ‣ PROJECT_HOME/build.gradle dependencies {
 compile 'com.jeroenmols.awesomelibrary:1.0.0'
 }

Slide 75

Slide 75 text

@MOLSJEROEN WAGON-GIT ▸ Use a Git as a Maven repository ▸ Supports GitHub and BitBucket (public or private) ▸ Inherent backups and remote access ▸ Open source (free) ▸ Maven plugin to do the upload

Slide 76

Slide 76 text

@MOLSJEROEN WAGON-GIT - UPLOAD ARTIFACTS 1 ▸ PROJECT_HOME/gradle.properties ARTIFACT_VERSION=1.0.0
 ARTIFACT_NAME=landscapevideocamera
 ARTIFACT_PACKAGE=com.jeroenmols.landscapevideocamera ARTIFACT_PACKAGING=aar
 
 BITBUCKET_TEAM=jmolsmobile
 REPOSITORY_NAME=maven_repository // encode "username:password" to base64
 BASE64CREDENTIALS=dXNlcm5hbWU6cGFzc3dvcmQ=

Slide 77

Slide 77 text

@MOLSJEROEN WAGON-GIT - UPLOAD ARTIFACTS 1 ▸ PROJECT_HOME/gradle.properties ARTIFACT_VERSION=1.0.0
 ARTIFACT_NAME=landscapevideocamera
 ARTIFACT_PACKAGE=com.jeroenmols.landscapevideocamera ARTIFACT_PACKAGING=aar
 
 BITBUCKET_TEAM=jmolsmobile
 REPOSITORY_NAME=maven_repository // encode "username:password" to base64
 BASE64CREDENTIALS=dXNlcm5hbWU6cGFzc3dvcmQ=

Slide 78

Slide 78 text

@MOLSJEROEN WAGON-GIT - UPLOAD ARTIFACTS 1 ▸ PROJECT_HOME/gradle.properties ARTIFACT_VERSION=1.0.0
 ARTIFACT_NAME=landscapevideocamera
 ARTIFACT_PACKAGE=com.jeroenmols.landscapevideocamera ARTIFACT_PACKAGING=aar
 
 BITBUCKET_TEAM=jmolsmobile
 REPOSITORY_NAME=maven_repository // encode "username:password" to base64
 BASE64CREDENTIALS=dXNlcm5hbWU6cGFzc3dvcmQ=

Slide 79

Slide 79 text

@MOLSJEROEN WAGON-GIT - UPLOAD ARTIFACTS 1 ▸ PROJECT_HOME/gradle.properties ARTIFACT_VERSION=1.0.0
 ARTIFACT_NAME=landscapevideocamera
 ARTIFACT_PACKAGE=com.jeroenmols.landscapevideocamera ARTIFACT_PACKAGING=aar
 
 BITBUCKET_TEAM=jmolsmobile
 REPOSITORY_NAME=maven_repository // encode "username:password" to base64
 BASE64CREDENTIALS=dXNlcm5hbWU6cGFzc3dvcmQ=

Slide 80

Slide 80 text

@MOLSJEROEN WAGON-GIT - UPLOAD ARTIFACTS 2 ▸ PROJECT_HOME/build.gradle apply plugin: 'maven' 
 uploadArchives {
 repositories.mavenDeployer {
 configuration = configurations.deployLibrary 
 repository(url: 'git:releases://[email protected]:' + BITBUCKET_TEAM + '/' + REPOSITORY_NAME + '.git ')
 
 pom.project {
 groupId = ARTIFACT_PACKAGE
 version = ARTIFACT_VERSION
 artifactId = ARTIFACT_NAME
 packaging = ARTIFACT_PACKAGING
 } } }

Slide 81

Slide 81 text

@MOLSJEROEN WAGON-GIT - UPLOAD ARTIFACTS 2 ▸ PROJECT_HOME/build.gradle apply plugin: 'maven' 
 uploadArchives {
 repositories.mavenDeployer {
 configuration = configurations.deployLibrary 
 repository(url: 'git:releases://[email protected]:' + BITBUCKET_TEAM + '/' + REPOSITORY_NAME + '.git ')
 
 pom.project {
 groupId = ARTIFACT_PACKAGE
 version = ARTIFACT_VERSION
 artifactId = ARTIFACT_NAME
 packaging = ARTIFACT_PACKAGING
 } } }

Slide 82

Slide 82 text

@MOLSJEROEN WAGON-GIT - UPLOAD ARTIFACTS 2 ▸ PROJECT_HOME/build.gradle apply plugin: 'maven' 
 uploadArchives {
 repositories.mavenDeployer {
 configuration = configurations.deployLibrary 
 repository(url: 'git:releases://[email protected]:' + BITBUCKET_TEAM + '/' + REPOSITORY_NAME + '.git ')
 
 pom.project {
 groupId = ARTIFACT_PACKAGE
 version = ARTIFACT_VERSION
 artifactId = ARTIFACT_NAME
 packaging = ARTIFACT_PACKAGING
 } } }

Slide 83

Slide 83 text

@MOLSJEROEN WAGON-GIT - UPLOAD ARTIFACTS 2 ▸ PROJECT_HOME/build.gradle apply plugin: 'maven' 
 uploadArchives {
 repositories.mavenDeployer {
 configuration = configurations.deployLibrary 
 repository(url: 'git:releases://[email protected]:' + BITBUCKET_TEAM + '/' + REPOSITORY_NAME + '.git ')
 
 pom.project {
 groupId = ARTIFACT_PACKAGE
 version = ARTIFACT_VERSION
 artifactId = ARTIFACT_NAME
 packaging = ARTIFACT_PACKAGING
 } } }

Slide 84

Slide 84 text

@MOLSJEROEN WAGON-GIT - UPLOAD ARTIFACTS 2 ▸ PROJECT_HOME/build.gradle apply plugin: 'maven' 
 uploadArchives {
 repositories.mavenDeployer {
 configuration = configurations.deployLibrary 
 repository(url: 'git:releases://[email protected]:' + BITBUCKET_TEAM + '/' + REPOSITORY_NAME + '.git ')
 
 pom.project {
 groupId = ARTIFACT_PACKAGE
 version = ARTIFACT_VERSION
 artifactId = ARTIFACT_NAME
 packaging = ARTIFACT_PACKAGING
 } } }

Slide 85

Slide 85 text

@MOLSJEROEN WAGON-GIT - UPLOAD ARTIFACTS 3 uploadArchives.dependsOn lookForArtifacts task lookForArtifacts {
 doLast {
 def libraryName = ARTIFACT_NAME + '-' + ARTIFACT_VERSION + '.aar'
 def repoPath = ARTIFACT_PACKAGE.replace(".", "/") + "/" + ARTIFACT_NAME + "/" + ARTIFACT_VERSION + "/" + libraryName
 def repositoryUrl = 'https://api.bitbucket.org/1.0/repositories/' + COMPANY + '/' + REPOSITORY_NAME + '/raw/releases/' + repoPath
 if (urlExists(repositoryUrl)) {
 throw new RuntimeException(“Artifact exists:" + ARTIFACT_VERSION)
 }
 return true
 } }

Slide 86

Slide 86 text

@MOLSJEROEN WAGON-GIT - UPLOAD ARTIFACTS 3 uploadArchives.dependsOn lookForArtifacts task lookForArtifacts {
 doLast {
 def libraryName = ARTIFACT_NAME + '-' + ARTIFACT_VERSION + '.aar'
 def repoPath = ARTIFACT_PACKAGE.replace(".", "/") + "/" + ARTIFACT_NAME + "/" + ARTIFACT_VERSION + "/" + libraryName
 def repositoryUrl = 'https://api.bitbucket.org/1.0/repositories/' + COMPANY + '/' + REPOSITORY_NAME + '/raw/releases/' + repoPath
 if (urlExists(repositoryUrl)) {
 throw new RuntimeException(“Artifact exists:" + ARTIFACT_VERSION)
 }
 return true
 } }

Slide 87

Slide 87 text

@MOLSJEROEN WAGON-GIT - UPLOAD ARTIFACTS 3 uploadArchives.dependsOn lookForArtifacts task lookForArtifacts {
 doLast {
 def libraryName = ARTIFACT_NAME + '-' + ARTIFACT_VERSION + '.aar'
 def repoPath = ARTIFACT_PACKAGE.replace(".", "/") + "/" + ARTIFACT_NAME + "/" + ARTIFACT_VERSION + "/" + libraryName
 def repositoryUrl = 'https://api.bitbucket.org/1.0/repositories/' + COMPANY + '/' + REPOSITORY_NAME + '/raw/releases/' + repoPath
 if (urlExists(repositoryUrl)) {
 throw new RuntimeException(“Artifact exists:" + ARTIFACT_VERSION)
 }
 return true
 } }

Slide 88

Slide 88 text

@MOLSJEROEN WAGON-GIT - UPLOAD ARTIFACTS 3 uploadArchives.dependsOn lookForArtifacts task lookForArtifacts {
 doLast {
 def libraryName = ARTIFACT_NAME + '-' + ARTIFACT_VERSION + '.aar'
 def repoPath = ARTIFACT_PACKAGE.replace(".", "/") + "/" + ARTIFACT_NAME + "/" + ARTIFACT_VERSION + "/" + libraryName
 def repositoryUrl = 'https://api.bitbucket.org/1.0/repositories/' + COMPANY + '/' + REPOSITORY_NAME + '/raw/releases/' + repoPath
 if (urlExists(repositoryUrl)) {
 throw new RuntimeException(“Artifact exists:" + ARTIFACT_VERSION)
 }
 return true
 } }

Slide 89

Slide 89 text

@MOLSJEROEN WAGON-GIT - UPLOAD ARTIFACTS 3 uploadArchives.dependsOn lookForArtifacts task lookForArtifacts {
 doLast {
 def libraryName = ARTIFACT_NAME + '-' + ARTIFACT_VERSION + '.aar'
 def repoPath = ARTIFACT_PACKAGE.replace(".", "/") + "/" + ARTIFACT_NAME + "/" + ARTIFACT_VERSION + "/" + libraryName
 def repositoryUrl = 'https://api.bitbucket.org/1.0/repositories/' + COMPANY + '/' + REPOSITORY_NAME + '/raw/releases/' + repoPath
 if (urlExists(repositoryUrl)) {
 throw new RuntimeException(“Artifact exists:" + ARTIFACT_VERSION)
 }
 return true
 } }

Slide 90

Slide 90 text

@MOLSJEROEN WAGON-GIT - UPLOAD ARTIFACTS 3 uploadArchives.dependsOn lookForArtifacts task lookForArtifacts {
 doLast {
 def libraryName = ARTIFACT_NAME + '-' + ARTIFACT_VERSION + '.aar'
 def repoPath = ARTIFACT_PACKAGE.replace(".", "/") + "/" + ARTIFACT_NAME + "/" + ARTIFACT_VERSION + "/" + libraryName
 def repositoryUrl = 'https://api.bitbucket.org/1.0/repositories/' + COMPANY + '/' + REPOSITORY_NAME + '/raw/releases/' + repoPath
 if (urlExists(repositoryUrl)) {
 throw new RuntimeException(“Artifact exists:" + ARTIFACT_VERSION)
 }
 return true
 } }

Slide 91

Slide 91 text

@MOLSJEROEN WAGON-GIT - UPLOAD ARTIFACTS 4 def urlExists(String repositoryUrl) {
 try {
 def conn = (HttpURLConnection) new URL(repositoryUrl).openConnection()
 
 conn.setRequestProperty("Authorization","Basic " + BASE64CREDENTIALS)
 conn.setConnectTimeout(10000)
 conn.setReadTimeout(10000)
 conn.setRequestMethod("HEAD")
 
 def responseCode = connection.getResponseCode()
 println("responseCode: " + responseCode)
 
 return (200 == responseCode) 
 } catch (IOException ignored) {
 return false
 } }

Slide 92

Slide 92 text

@MOLSJEROEN WAGON-GIT - UPLOAD ARTIFACTS 4 def urlExists(String repositoryUrl) {
 try {
 def conn = (HttpURLConnection) new URL(repositoryUrl).openConnection()
 
 conn.setRequestProperty("Authorization","Basic " + BASE64CREDENTIALS)
 conn.setConnectTimeout(10000)
 conn.setReadTimeout(10000)
 conn.setRequestMethod("HEAD")
 
 def responseCode = connection.getResponseCode()
 println("responseCode: " + responseCode)
 
 return (200 == responseCode) 
 } catch (IOException ignored) {
 return false
 } }

Slide 93

Slide 93 text

@MOLSJEROEN WAGON-GIT - UPLOAD ARTIFACTS 5 repositories {
 maven { url "https://raw.github.com/synergian/wagon-git/releases" } }
 
 configurations {
 deployLibrary
 }
 
 dependencies {
 deployLibrary "ar.com.synergian:wagon-git:0.2.0"
 }

Slide 94

Slide 94 text

@MOLSJEROEN WAGON-GIT - UPLOAD ARTIFACTS 5 repositories {
 maven { url "https://raw.github.com/synergian/wagon-git/releases" } }
 
 configurations {
 deployLibrary
 }
 
 dependencies {
 deployLibrary "ar.com.synergian:wagon-git:0.2.0"
 }

Slide 95

Slide 95 text

@MOLSJEROEN WAGON-GIT - UPLOAD ARTIFACTS 5 repositories {
 maven { url "https://raw.github.com/synergian/wagon-git/releases" } }
 
 configurations {
 deployLibrary
 }
 
 dependencies {
 deployLibrary "ar.com.synergian:wagon-git:0.2.0"
 }

Slide 96

Slide 96 text

@MOLSJEROEN WAGON-GIT - UPLOAD ARTIFACTS 5 repositories {
 maven { url "https://raw.github.com/synergian/wagon-git/releases" } }
 
 configurations {
 deployLibrary
 }
 
 dependencies {
 deployLibrary "ar.com.synergian:wagon-git:0.2.0"
 }

Slide 97

Slide 97 text

@MOLSJEROEN WAGON-GIT - UPLOAD ARTIFACTS 6 task androidJavadocs(type: Javadoc) {
 failOnError false
 source = android.sourceSets.main.java.sourceFiles
 }
 
 task androidSourcesJar(type: Jar) {
 classifier = 'sources'
 from android.sourceSets.main.java.sourceFiles
 }
 
 task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
 classifier = 'javadoc'
 from androidJavadocs.destinationDir
 }
 
 artifacts {
 archives androidSourcesJar
 archives androidJavadocsJar
 }

Slide 98

Slide 98 text

@MOLSJEROEN WAGON-GIT - UPLOAD ARTIFACTS 7 ▸ $ gradle assembleRelease uploadArchives

Slide 99

Slide 99 text

@MOLSJEROEN WAGON-GIT - SCRIPT apply from: ‘publish-wagongit.gradle’ ▸ Keep an eye on my Twitter @MolsJeroen

Slide 100

Slide 100 text

@MOLSJEROEN CONSUME ARTIFACTS ‣ PROJECT_HOME/build.gradle allprojects {
 repositories {
 maven {
 credentials {
 username ''
 password ‘'
 }
 url "https://api.bitbucket.org/1.0/repositories/" + “//raw/releases"
 } } } ‣ MODULE_HOME/build.gradle dependencies {
 compile "com.jeroenmols:landscapevideocamera:"
 }

Slide 101

Slide 101 text

@MOLSJEROEN CONSUME ARTIFACTS ‣ PROJECT_HOME/build.gradle allprojects {
 repositories {
 maven {
 credentials {
 username ''
 password ‘'
 }
 url "https://api.bitbucket.org/1.0/repositories/" + “//raw/releases"
 } } } ‣ MODULE_HOME/build.gradle dependencies {
 compile “com.jeroenmols:landscapevideocamera:"
 }

Slide 102

Slide 102 text

@MOLSJEROEN CONSUME ARTIFACTS ‣ PROJECT_HOME/build.gradle allprojects {
 repositories {
 maven {
 credentials {
 username ''
 password ‘'
 }
 url "https://api.bitbucket.org/1.0/repositories/" + “//raw/releases"
 } } } ‣ MODULE_HOME/build.gradle dependencies {
 compile “com.jeroenmols:landscapevideocamera:"
 }

Slide 103

Slide 103 text

@MOLSJEROEN CONSUME ARTIFACTS ‣ PROJECT_HOME/build.gradle allprojects {
 repositories {
 maven {
 credentials {
 username ''
 password ‘'
 }
 url "https://api.bitbucket.org/1.0/repositories/" + “//raw/releases"
 } } } ‣ MODULE_HOME/build.gradle dependencies {
 compile "com.jeroenmols:landscapevideocamera:"
 }

Slide 104

Slide 104 text

@MOLSJEROEN CREDITS ▸ Gradle Maven Push script @chrisbanes ▸ Distributing Android Libraries via jCenter for Gradle Importing @attwellbrian ▸ A private Maven repository in 30 min @molsjeroen ▸ Getting the most out of Artifactory @molsjeroen

Slide 105

Slide 105 text

@MOLSJEROEN OTHER INTERESTING ARTICLES ▸ Gradle dependency and local repository @turhanoz ▸ Creating and publishing an Android library @Etienne_Lawlor ▸ Publish with Gradle on BitBucket @mul0w

Slide 106

Slide 106 text

@MOLSJEROEN MANY THANKS ▸ Jeroen Mols (Belgium) ▸ @MolsJeroen ▸ https://jeroenmols.github.io/blog/