본문 바로가기

Android/Utility

[Android] JitPack을 사용하여 라이브러리 모듈을 배포해보자.

728x90

업무를 보는 도중 이전 프로젝트에서 사용하던 모듈을 가져와서 사용하고 싶다는 생각이 문득 들었다.

해당 모듈이 다른 외부 라이브러리처럼 배포가 되어있었다면 간단하게 사용하기 쉬울 텐데..라는 생각을 하던 와중

라이브러리로 배포를 하는 방법에 대해서 찾아보게 되었다.

JitPack을 사용하면 아주 간단하게 라이브러리 모듈 배포가 가능하다고 해서 사용해 보았는데, 

자료를 잘못 봤는지 오류가 상당히 많이 발생하였다.

따라서, 해당 문제들을 해결하는 방법에 대하여 작성해보고자 한다.


우선,

라이브러리로 만들어 볼 샘플 프로젝트를 만들어 보자.

 

 

필자가 업무를 보다가 API 관련 데이터를 확인하려고 임시로 만들어 둔 함수를 클래스로 만들어 보았다.

 

private val gson = Gson()
fun printData(dataModel: DomainEntity<out Any>, isData: Boolean) {
    dataModel.data.let {
        val jsonObject = JSONObject(gson.toJson(dataModel))
        val dtoName = it.javaClass.name.split(".").toTypedArray()
        var logString = "Code : ${dataModel.code}\nMsg  : ${dataModel.message}\n" +
                "Type : ${dtoName[dtoName.size - 1]}\n\n"

        if(isData) {
            logString +=
                printDataSample(jsonObject.getString("data").toString(),0)
        }

        Log.d("apiLogger",logString)
    }
}

 

Logger 함수는 대략 이런식으로 구현이 되어있다.

DomainEntity으로 받아온 데이터를 보여주고, 세부 데이터는 isData라는 boolean 값을 통해 선택적으로 보여주도록 구현해 두었다.

 

이런 식으로 간단하게 샘플 프로젝트를 만들어 둔 후에, JitPack을 사용하여 라이브러리 모듈로 배포하기 위한 세팅을 해보도록 하자.

 

우선,

JitPack 사용을 위한 Gradle 세팅을 해주어야 한다.

dependencies {
    ... 
    
    classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
}

 

Project 단위의 Gradle에 다음과 같이 maven plugin을 추가해 주고,

 

allprojects {
    repositories {
        google()
        mavenCentral()
        jcenter() // Warning: this repository is going to shut down soon
    }

    group = 'com.github.HeeGyeong'
}

 

모듈을 올려두고 배포할 github 주소를 group을 선언하고 추가해 준다.

github의 주소는 'com.github.userName'으로 되어있으니, 해당 부분을 자신에 맞춰 수정해주면 된다.

 

그다음으로

 

plugins {
    id 'com.android.library'
    id 'org.jetbrains.kotlin.android'
    id 'com.github.dcendents.android-maven'
}

 

Module 단위의 Gradle에 다음과 같이 plugin 설정을 해준다.

해당 프로젝트는 application 단이 없이 library만 존재하기 때문에, plugins에서 library로 반드시 설정을 해두어야 한다.

 

이렇게 작업을 해두고 sync를 눌렀더니 필자는 다음과 같은 오류가 발생하였다.

 

Unable to load class 'org.gradle.api.publication.maven.internal.MavenPomMetaInfoProvider'

 

뭔가 오류가 났는데 뭔지 모르겠다.

따라서 구글링을 해보았는데, Gradle 버전의 문제라고 한다.

필자는 기왕 프로젝트 하나 새로 파는 김에 Gradle 버전을 7.0.0로 올려서 사용해 보았는데, 이게 문제였다.

Gradle 7.0.0 버전에서는

 

id 'com.github.dcendents.android-maven'

 

Plugins의 이것을 사용할 수 없는 것 같다.

StackOverflow에서도 좀 찾아봤는데, 정확한 이유는 모르겠고 모두 저 부분이 문제라고 한다.

 

그래서 Gradle을 downGrade 하여서 사용하도록 하였다.

버전을 낮추고 다시 Sync를 돌리니 성공을 하였다.

 

이렇게 설정을 해두었으면,

 

깃 허브로 들어가서 추가적인 작업을 해주어야 한다.

 

우선, Github에 Repository를 새로 생성하여 위에 만들어 두었던 샘플 프로젝트를 업로드해주어야 한다.

Github에서 라이브러리 모듈 배포를 위해 해야 하는 작업은, 업로드되어있는 버전의 소스코드의 Releases를 만들어야 하는 것이다.

 

프로젝트를 Github에 업로드를 하게 되면 위의 사진과 같이 나오게 되는데, 여기서 이미지 우측 하단에 보이는 Releases 탭의 Create a new release를 눌러준다.

만약, 이미 release 된 버전이 있다면, Create 버튼이 아닌 Releases 탭 자체를 클릭해서 들어가 주면 된다.

 

 

그러면 다음과 같은 화면이 나오게 되는데, Choose a Tag 부분에서 원하는 태그를 달아주도록 한다.

필자는 첫 번째 버전이기 때문에 1.0.0 태그를 추가하도록 하였다.

 

 

태그를 추가하였으면, 다른 별도의 작업은 필요 없이 하단에 있는 Publish release 버튼을 통해 Relase를 생성해주도록 한다.

 

이렇게 Release를 생성해 주면 Github에서의 작업도 끝이 나게 된다.

 

 

다음으로는 드디어 JitPack을 사용하여 배포하여 사용하는 일만 남았다.

https://jitpack.io

 

JitPack | Publish JVM and Android libraries

JitPack makes it easy to release your Java or Android library. Publish straight from GitHub or Bitbucket.

jitpack.io

 

JitPack에 들어가면 다음과 같은 화면을 볼 수 있다,

 

 

 

Git repo url에 방금 전에 배포한 라이브러리 모듈을 가져와 주면 된다.

해당 페이지는 gitHub 로그인이 가능하도록 되어있어서, Github로그인을 하게 된다면 좌측에 Repository List가 나오니 클릭을 하면 된다.

 

 

Repository를 입력하고 Look up을 누르게 되면 다음과 같은 화면을 볼 수 있을 것이다.

생각보다 해당 화면이 갱신되는 시간이 길고, Log 부분에 로딩되는 부분의 시간이 생각보다 길게 나오니까 천천히 기다려보면 될 것이다.

 

해당 부분 로딩이 끝나면 다음과 같이 2가지 경우가 발생하게 된다.

 

 

초록색 문서와 빨간색 문서 2가지 종류가 나오게 되는데, 색상부터 알 수 있듯이 초록색 문서가 나오면 성공이고 빨간색 문서가 나오면 실패가 되는 것이다.

버전 이름만 봐도 알 수 있듯이 필자는 상당히 많은 시행착오를 거쳐서 성공하였다.

 

그 말은 즉, 위의 소스코드를 통해 작업을 한 것은 배포에 실패가 한 게 된 것이다.

빨간색 문서를 눌러서 오류가 발생한 이유를 확인할 수 있다.

 

 

맨 하단을 확인해보면 다음과 같은 오류가 나와있다.

 

해당 오류를 검색해보니 여러 가지 해결 방안이 나오는데, 다양한 해결방법을 사용해 보았다.

 

우선, gradle에 추가적인 작업을 해준다.

 

id 'maven-publish'

 

Module 범위의 Gradle에 해당 Plugins를 추가해 주고,

 

publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java

            groupId = 'com.example.apilogger'
            artifactId = 'apiLogger'
            version = '1.0.1'
        }
    }
}


마찬가지로 Module 범위의 Gradle에 publishing을 추가해 준다.

필자는 해당 부분을 추가하라는 글은 많이 찾았는데, 정작 어디에 추가를 해야 하는지 알 수 없어서 한참을 찾았다.

 

이렇게 추가하면 된다고 하니 다시 sync를 눌러 주었다.

 

Could not get unknown property 'java' for SoftwareComponentInternal set of type org.gradle.api.internal.component.DefaultSoftwareComponentContainer.

 

다음과 같은 오류가 나오면서 안된다.

 

좀 더 확인해보니, Gradle 4.0.0 이상의 버전부터는 afterEvaluate를 사용하여 publishing을 묶어줘야 한다고 한다.

 

afterEvaluate {
    publishing {
        publications {
            mavenJava(MavenPublication) {
                from components.java

                groupId = 'com.example.apilogger'
                artifactId = 'apiLogger'
                version = '1.0.1'
            }
        }
    }
}

 

묶어줬다.

 

안된다.

 

좀 더 구글링을 해보았다.

 

Developers 문서에 maven 관련 추가하는 방식이 나와있다.

https://developer.android.com/studio/build/maven-publish-plugin?hl=ko 

 

Maven Publish 플러그인 사용  |  Android 개발자  |  Android Developers

Android 스튜디오에서 Gradle 빌드 시스템을 사용하여 게시할 라이브러리를 구성하는 방법을 알아보세요.

developer.android.com

 

afterEvaluate {
    publishing {
        publications {
            release(MavenPublication) {
                from components.release

                groupId = 'com.example.apilogger'
                artifactId = 'apiLogger'
                version = '1.2'
            }
            debug(MavenPublication) {
                from components.debug

                groupId = 'com.example.apilogger'
                artifactId = 'apiLogger-debug'
                version = '1.2'
            }
        }
    }
}

 

일단 debug 부분을 제외하고, mavenJava를 사용하지 않는다. 공식 문서에서는 library일 경우 release를 사용한다고 한다.

따라서 release로 변경하고, 공식문서를 따라서 debug도 추가해 보았다.

또한, components 부분도 변경해준다.

 

이 부분에서 필자는 상당한 시간이 걸렸다.

다른 블로그나, stackOverflow를 확인해보면 plugins에 선언된 것과 상관없이 mavenJava , from components.java를 사용해야 한다고 작성되어 있거나, 해당 부분들만 다르게 변경해서 사용하면 해결된다.라는 글이 상당히 많았다.

 

하지만 release, from components.release로 선언하지 않고 다른 종류의 값을 넣을 경우,

from components 부분에서 오류가 발생하여 빌드할 수 없으니 공식 문서를 확인하고 작성하길 바란다.

 

자, 공식 문서대로 작업을 했으니 정상적으로 빌드가 되었다.

따라서 위에 했던 작업들을 다시 해준다.

gitHub에 올리고, release 태그를 새로 만들어서 버전을 올려준다.

그 후 jitPack에 들어가서 다시 배포 시도를 해보면

 

 

 

1.2.1 버전에서 성공한 것을 확인할 수 있다.

성공한 경우 Status 부분에 Get it으로 버튼이 활성화된 것을 볼 수 있는데, 그 버튼을 눌러보도록 하자.

 

 

사용하는 방법이 나온다.

 

그러면 해당 라이브러리를 사용할 다른 프로젝트에서 사용해 보도록 하자.

 

allprojects {
    repositories {
        google()
        mavenCentral()
        maven { url 'https://jitpack.io' }
        jcenter() // Warning: this repository is going to shut down soon
    }
}
// apiLogger
implementation 'com.github.HeeGyeong:ApiLogger:1.2.1'

 

Project범위의 Gradle과 Module범위의 Gradle에 각각 추가해 준다.

그 후, Log를 확인할 부분에

 

ApiLogger().printData(null, false)

 

라이브러리를 호출해주면 정상적으로 호출되는 것을 확인할 수 있다.


이것으로 간단한 라이브러리 모듈을 간단하지 않게 추가해 보았다.

Publishing을 추가하는 부분에서 막혀서 상당히 오랜 시간 해당 문제를 해결하지 못하였었다.

Developers 문서에 해당 부분이 있는지 알았으면 바로 확인해 봤을 텐데, 많은 시간을 낭비하게 된 것 같아 아쉽다.

 

또한, Gradle 최신 버전에서는 정상적으로 사용할 수 없는 것이 조금씩 보이는 것 같다.

역시 가장 최신 버전은 사용하지 않는 게 정신 건강에 좋은 것 같다.

 

라이브러리 모듈을 어떻게 배포하는지 정확히 확인할 수 있었으니,

다음에 필요한 것들을 모듈로 빼내어 사용할 수 있도록 많은 생각을 해봐야 할 것 같다.

728x90