[Android] maven jcenter vs mavenCentral

2021. 6. 2. 10:39모바일/Android_Java

jCenter에 안드로이드 라이브러리 배포하기

Android Library GearSlider를 만든 후 jcenter에 배포한 경험을 공유하기 위해 글을 작성합니다. 구글에 검색하여 나온 블로그 글을 참조했는데 중간에 막히는 부분이 있어서 다른 배포도구를 활용했습니다.

이 문서의 최종 목표는

1:  dependencies {  
2:    compile '나만의.안드로이드.라이브러리'  
3:  }  

위와 같이 build.gradle 파일에 작성함으로써 자신의 라이브러리를 다른 사람들과 쉽게 공유할 수 있게 만드는 것에 있습니다. 이 글을 읽기 전에 Android 공식 홈페이지의 글을 먼저 읽어 보시길 바랍니다.

단 한줄만으로 라이브러리를 가져올수 있다는 것은 굉장히 유용합니다. 그렇다면 우리는 어디에 라이브러리를 올려두어야 다른 안드로이드 개발자들이 쉽게 가져올 수 있을까요.

Android Studio는 어디에서 라이브러리를 가져오는 걸까?

Android Studio는 build.gradle 에 작성해둔 Maven Repository Server에서 라이브러리를 가져옵니다. 일반적으로 안드로이드는 jcenterMaven Central에서 라이브러리를 가져옵니다.

jcenter
jcenter는 bintray.com이 운영하는 Maven Repository입니다. jcenter의 라이브러리를 사용하기 위해서는 build.gradle 파일에 아래와 같이 정의해야 합니다.

1:  allprojects {  
2:    repositories {  
3:      jcenter()  
4:    }  
5:  }  

**
**Maven Central
Maven Central은 sonatype.org이 운영하는 Maven Repository입니다. Maven Central의 라이브러리를 사용하기 위해서는 build.gradle 파일에 아래와 같이 정의해야 합니다.

1:  allprojects {  
2:    repositories {  
3:      mavenCentral()  
4:    }  
5:  }  

jcenter와 Maven Central은 둘다 표준 안드로이드 라이브러리 저장소들이지만 완전히 다른 장소에서 운영됩니다. 서로 아무런 연관이 없습니다. (jcenter는 Maven Central 저장소에 배포하는 기능을 제공하긴합니다.)

그 외의 곳에서는?
그 외의 다른 저장소로부터 라이브러리를 가져오기 위해선 아래와 같이 저장소의 위치를 명시해주어야 합니다.

1:  repositories {  
2:    maven { url '다른저장소의주소' }  
3:  }  

그렇게 하면 그 저장소에 배포되어있는 다른 라이브러리를 가져올수 있습니다.

1:  dependencies {  
2:    compile '다른저장소에있는.라이브러리'  
3:  }  

그렇다면, 표준서버와 개인서버에 배포하는것 중 무엇이 좋을까요? 개인적으로 사용해야하는 라이브러리는 개인서버에 배포하는것이 낫고, 다른 개발자들과 함께 나누고 싶다면 표준서버에 배포하는것이 좋을겁니다. 그냥 개인의 판단에 따라 마음에 드는곳에 하시면됩니다. 이 글에서는 jCenter에 배포하는법에 대해서 다룹니다.

jcenter와 Maven Central에 대한 이해

jcenter와 Maven Central은 Java/Android 라이브러리들을 배포한다는 공통점을 가지고 있습니다.

초반에 Android Studio에서는 Maven Central을 기본 저장소로 선택했습니다. 과거버전 Android Studio 프로젝트의 build.gradle에서는 mavenCentral()이 정의 되어있을 것입니다.

하지만 Maven Central은 개발자 친화적이지 않았습니다. 라이브러리를 업로드하는것이 정말정말정말로 어렵고 geeky의 레벨에 도달한 개발자들이나 가능했습니다. 그리고 기타등등 문제들 때문에 Android Studio 팀은 jcenter를 기본 저장소로 변경하기로 결정했습니다.

Maven Central에서 jcenter로 변경한것에는 다양한 이유가 있습니다

  1. jcenter는 CDN을 통해 라이브러리를 배포합니다. 따라서 개발자들은 빠른 로딩속도를 즐길수 있습니다.
  2. jcenter는 지구상에서 가장큰 Java Repository입니다.
  3. 저장소에 라이브러리를 업로드하는것이 정말정말정말 쉽습니다.
  4. 친근한 UI !
  5. 만약 Maven Central에 라이브러리를 배포하고싶다면 bintray site에서 한번의 클릭을 통해 배포할 수 있습니다. ( 한번 설정을 해주어야하긴 합니다)

위와 같은 이유 때문에 jcenter를 기본저장소로 지정한것이 굉장히 좋은판단이였다고 생각됩니다. 라고 하네요. (왜 처음에는 Maven Central를 지정했는지 의문입니다) ~
~
~

gradle은 어떻게 저장소로부터 라이브러리를 가져올까?

어떻게 jcenter로 라이브러리를 업로드하는지 말하기전에. gradle이 어떻게 저장소로부터 라이브러리를 가지고 오는지 알아봅시다. 예를들어 build.gradle에 아래와 같이 적혀있다면, 그 프로젝트에 해당 라이브러리 파일이 다운로드 됩니다.

1:  compile 'org.nhnnext.sunghwanjo:gearslider:0.1.1'  

기본적으로 라이브러리를 가져오기 위한 문자열은 3개의 부분으로 구성되어 있습니다.

1:  GROUP_ID:ARTIFACT_ID:VERSION  

위에서 GROUP_ID는 org.nhnnext.sunghwanjo 입니다. ARTIFACT_ID는 gearslider이고 VERSION은 0.1.1이죠.

GROUP_ID는 라이브러리의 그룹이름을 의미합니다. 같은 문맥상 여러가지일을 하는 하나이상의 라이브러리가 있을 가능성이 있습니다. 이럴때 GROUP_ID를 공유하면 됩니다. 보통 개발자의 패키지명으로 합니다.
ARTIFACT_ID는 라이브러리의 이름입니다. VERSION은 버전정보인데 어떤 텍스트가 들어가도 상관없습니다. 다만, x.y.z의 형태로 작성하는 것을 추천합니다. 만약 본인이 원한다면 뒤에 -beta를 붙여도 괜찮습니다.

1:  dependencies {  
2:    compile 'com.squareup:otto:1.3.7'  
3:    compile 'com.squareup.picasso:picasso:2.5.2'  
4:    compile 'com.squareup.okhttp:okhttp:2.4.0'  
5:    compile 'com.squareup.retrofit:retrofit:1.9.0'  
6:  }  

위와 같이 의존성을 추가한다면 무슨일이 벌어질까요? Gradle은 Maven Repository Server에 원하는 라이브러리가 존재하는지 물어볼 것입니다. 존재한다면 주로 GROUP_ID:ARTIFACT_ID:VERSION_ID의 형태로 요청된 라이브러리의 경로를 얻을 것입니다.

그리고 Android Studio는 우리의 장비에 파일들을 다운로드하고 컴파일합니다. 그렇다면 라이브러리를 가져오는것은 끝!

이제 저장소로부터 library를 가져오는 방법에 대해서는 알지만 jar 와 aar 파일이 저장소 서버에 올려졌다는 것은 잘 모를것입니다. 또는 aar에 대해서 잘 모른다거나.

aar 파일 포맷을 알아보자

~
\
jar파일이 그냥 커피라면 aar 파일이 top 입니다.~~

aar 파일은 Android 라이브러리 프로젝트의 컴파일된 묶음파일입니다. 압축파일? Android 라이브러리는 AndroidManifest.xml, Resources, Assets, JNI처럼 jar 파일의 표준에는 벗어나는 안드로이드 종속적인 파일들을 포함할 필요가 있기 때문에 생겼습니다. 그래서 aar은 앞서 말한것들을 모두 포함합니다. jar 파일은 aar 파일안에 classes.jar 라는 이름으로 포함되어 있습니다. 아래는 파일 리스트 입니다.

  • /AndroidManifest.xml (mandatory)
  • /classes.jar (mandatory)
  • /res/ (mandatory)
  • /R.txt (mandatory)
  • /assets/ (optional)
  • /libs/*.jar (optional)
  • /jni//*.so (optional)
  • /proguard.txt (optional)
  • /lint.jar (optional)

보시다시피 aar 파일은 안드로이드를 위해 특별히 설계되었습니다. 이 문서에서도 aar 형태의 라이브러리를 어떻게 만들고 배포하는지 작성할 것입니다.

jcenter에 나만의 라이브러리를 업로드하는 방법

이제 저장소에 라이브러리를 올리기 위한 기본적인 지식들은 갖고 있으니, 정말로 배포를 시작해봅시다. 우리의 목표는 간단합니다. "http://jcenter.bintray.com"에 우리의 라이브러리를 업로드 하는 방법. 입니다.

해야할 단계가 좀 있긴한데 전체적으로 그렇게 어렵지는 않습니다. bintray가 정말 잘 만들어 놨거든요. 전체적인 시스템은 이렇습니다.

img

이미지출처 : http://inthecheesefactory.com/blog/how-to-upload-library-to-jcenter-maven-central-as-dependency/en

Android Studio에서 arr, pom 파일들을 빌드한후 Bintray로 업로드 합니다. 그리고 jcenter와 동기화. 그러면 끝입니다. Maven Central과 연동할 수도 있는데 그건 다루지 않습니다. 자료가 많고 되게 쉽거든요.

앞으로 할 작업들을 단계별로 나누어서 설명하도록 하겠습니다.

Part 1: Bintray에 패키지 만들기

첫째로. bintray에 패키지를 만들 필요가 있습니다. bintray 계정이 필요하고 웹사이트에 패키지를 만들겁니다.

단계 1: bintray.com 에 계정을 등록합니다.

단계 2: 등록이 끝났으면, maven을 클릭합니다. (현재 저는 1개의 패키지가 등록되어있어서 (1)이 있습니다. )

출처 : https://sunghwanjo94.blogspot.com/2015/07/jcenter.html