Skip to content

Maven

갑작스레 잘 쓰고 있던 Jcenter 가 종료함에 따라 maven 을 처음 써보게 되었다. 물론 Jcenter 도 처음이었지만 굉장히 손쉽게 했었는데 maven 은 생각보다 쉽지 않아서 마이그레이션 가이드를 공유 해보려고 한다.

계정 생성#

안드로이드 라이브러리를 Maven 에 배포하기 위해서는 Nexus repository manager 에 접근하려면 계정이 있어야 합니다. Nexus repository manager 에서는 로그인만 제공되며 계정생성이 안되기 때문에 sonatype 을 통해 계정생성을 합니다.

sign up

여기서 Username 과 Password 가 nexus repo 계정이 됩니다. 그리고 Username 은 계정생성후 변경이 되지 않더군요. (유의바람)

가입후 Create 버튼으로 이슈를 등록해야 한다. 아래 2가지 항목은 필히 선택해주고 나머지는 편집가능하다. * Project : Community Support - Open Source Project Repository Hosting (OSSRH) * Issue Type : New Project

참고로 라이브러리 소스가 비공개여도 상관없습니다.

여기까지 성공하면 대쉬보드가 나올 것이고 2가지를 만족시켜주고 코멘트를 달아주면 됩니다.

Dash board

  • Group Id 를 io.github.* 형태로 변경
  • 아래 코멘트중에 JIRA ticket 이라고 발급된 OSSRH-68408(필자경우)를 가지고 public git repo 생성
  • 위 2가지가 만족됐다면 확인해달라고 코멘트 작성

자세한 진행 사항이 알고 싶다면 나의 이슈 를 참고바랍니다. 말하자면 여기까지 진행한 것들은 maven 에 업로드할 계정권한을 얻는 과정이라고 보면 될 것 같습니다.

저장소 배포 준비#

코멘트에 관리자가 groupId has benn prepared 라고 남겼다면 Nexus repository manager 로 로그인 가능해진겁니다. 위에서 만든 Username 과 Password 로 로그인합니다.

Nexus repo Dashboard

이런 페이지가 나올 것이고 Profile > User Token > Access User Token 를 누르면 토큰을 발급 받을 수 있는데 제 경우에는 토큰이 필요 없었습니다. 아마 pom.xml 을 직접 컨트롤하지 않고 gradle 스크립트를 이용해서 그런 것 같은데요. 일단 진행 해봅시다.

배포 스크립트 설정#

자 이제 staging 이라는 저장소로 라이브러리를 스크립트로 통해 배포해 볼건데요. 스크립트 작성에 앞서 GPG 키를 만들어야 합니다.

GPG 키 인증#

GPG 를 통해 발급받은 정보들을 프로젝트내 gradle.properties 파일에 설정해줍니다.

signing.keyId=YourKeyId
signing.password=your-jira-password
signing.secretKeyRingFile=../secring.gpg

ossrhUsername=your-jira-id
ossrhPassword=your-jira-password

배포#

  • 기존 jcenter 는 mavenCentral 로 변경
  • classpath "com.android.tools.build:gradle:3.4.0" 를 사용함

build.gradle 스크립트 예제

apply plugin: 'com.android.library'
apply plugin: 'maven'
apply plugin: 'signing'

group = "io.github.jameschun7"
archivesBaseName = "universalsdk"
version = "0.2.3"

signing {
    sign configurations.archives
}

uploadArchives {
    repositories {
        mavenDeployer {
            beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }

            repository(url: "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/") {
                authentication(userName: 'your-jira-id', password: 'your-jira-password')
            }

            snapshotRepository(url: "https://s01.oss.sonatype.org/content/repositories/snapshots/") {
                authentication(userName: 'your-jira-id', password: 'your-jira-password')
            }

            pom.project {
                name 'Universal Android SDK'
                packaging 'aar'
                // optionally artifactId can be defined here
                description 'The Universal SDK for Android provides a modern way of implementing open APIs.'
                url 'https://github.com/jameschun7/simple-firebase-sdk-unity'

                scm {
                    url 'https://github.com/jameschun7/universal-sdk-android.git'
                }

                licenses {
                    license {
                        name 'The Apache License, Version 2.0'
                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }

                developers {
                    developer {
                        id 'jameschun7'
                        name 'james chun'
                        email 'chc3484@gmail.com'
                    }
                }
            }
        }
    }
}

패키지명 변경#

groupId 를 변경했다면 패키지명도 동일하게 맞춰줘야 한다.

패키지명 변경하기

maven 배포#

gradle uploadArchives

Staging 배포 확인#

배포후 Staging Repo 에서 Refresh 버튼을 눌러주면 라이브러리가 올라간 것을 확인할 수 있다. 해당 레포지토리를 클릭하면 Close, Drop 버튼이 활성화 되며 Close 버튼을 눌러서 확인하면 검수절차가 진행된다.

검수 결과 실패 또는 성공에 대한 로그를 확인할 수 있고 성공시 Release 버튼이 활성화 된다.

물론 릴리즈하면 라이브로 배포가 되는 것이다.

정상 배포가 완료되면 Staging Repo 의 상태는 Closed 가 된다.

라이브 배포 확인#

약 2시간정도면 지라 대쉬보드쪽에 첫 배포에 대한 코멘트가 달릴 것이고 maven 저장소 에서 검색하면 배포한 라이브러리가 검색된다.

comment

사용#

  • jcenter -> mavenCentral
  • maven url 변경
buildscript {    
    repositories {
        google()
        mavenCentral()
        maven {
            url "https://repo1.maven.org/maven2/"
        }
    }
    ...
}

allprojects {
    repositories {
        google()
        mavenCentral()
        maven {
            url "https://repo1.maven.org/maven2/"
        }
    }
}

dependencies {
    implementation 'io.github.jameschun7:universalsdk:0.2.4'    
}

Maven Publish 플러그인으로 마이그레이션#

plugins {
    ...
    id 'com.android.library'    // 안드로이드 라이브러리임을 나타내는 플러그인
    id 'maven-publish'          // 메이븐 배포용 플러그인
    id 'signing'                // 서명용 플러그인
}

// 프로젝트 정보
group 'io.github.coolishbee'
version '0.1'

// 메이븐 배포 작업 지시사항
afterEvaluate { 

    // 배포하기
    publishing {

        // 배포할 레포지토리 지정
        repositories {
            maven {
                name 'sonatype'
                url 'https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/'

                // 인증 정보 기입 (nexus manager 계정)
                credentials {
                    username ossrhUsername
                    password ossrhPassword
                }
            }
        }

        // 배포할 아티팩트의 정보
        publications {
            release(MavenPublication){
                from components.release

                // dependencies로 표시될 문자열 (ex. io.github.coolishbee:universalsdk:0.1)
                groupId 'io.github.coolishbee'
                artifactId 'universalsdk'
                version '0.1'

                // 상세정보
                pom {
                    name = 'Universal Android SDK'
                    description = 'The Universal SDK for Android provides a modern way of implementing open APIs.'
                    url = 'https://github.com/coolishbee/MyLibrary'
                    licenses {
                        license {
                            name = 'Apache License, Version 2.0'
                            url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                        }
                    }
                    developers {
                        developer {
                            id = 'coolishbee'
                            name = 'James'
                            email = 'coolishbee@gmail.com'
                        }
                    }
                    scm {
                        url = 'https://github.com/coolishbee/MyLibrary.git'
                    }
                }
            }
        }
    }
}

// 서명 작업 지시사항
signing {
    sign publishing.publications
}