Maven
갑작스레 잘 쓰고 있던 Jcenter 가 종료함에 따라 maven 을 처음 써보게 되었다. 물론 Jcenter 도 처음이었지만 굉장히 손쉽게 했었는데 maven 은 생각보다 쉽지 않아서 마이그레이션 가이드를 공유 해보려고 한다.
계정 생성#
안드로이드 라이브러리를 Maven 에 배포하기 위해서는 Nexus repository manager 에 접근하려면 계정이 있어야 합니다. Nexus repository manager 에서는 로그인만 제공되며 계정생성이 안되기 때문에 sonatype 을 통해 계정생성을 합니다.
여기서 Username 과 Password 가 nexus repo 계정이 됩니다. 그리고 Username 은 계정생성후 변경이 되지 않더군요. (유의바람)
가입후 Create 버튼으로 이슈를 등록해야 한다. 아래 2가지 항목은 필히 선택해주고 나머지는 편집가능하다. * Project : Community Support - Open Source Project Repository Hosting (OSSRH) * Issue Type : New Project
참고로 라이브러리 소스가 비공개여도 상관없습니다.
여기까지 성공하면 대쉬보드가 나올 것이고 2가지를 만족시켜주고 코멘트를 달아주면 됩니다.
- Group Id 를 io.github.* 형태로 변경
- 아래 코멘트중에 JIRA ticket 이라고 발급된 OSSRH-68408(필자경우)를 가지고 public git repo 생성
- 위 2가지가 만족됐다면 확인해달라고 코멘트 작성
자세한 진행 사항이 알고 싶다면 나의 이슈 를 참고바랍니다. 말하자면 여기까지 진행한 것들은 maven 에 업로드할 계정권한을 얻는 과정이라고 보면 될 것 같습니다.
저장소 배포 준비#
코멘트에 관리자가 groupId has benn prepared 라고 남겼다면 Nexus repository manager 로 로그인 가능해진겁니다. 위에서 만든 Username 과 Password 로 로그인합니다.
이런 페이지가 나올 것이고 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 저장소 에서 검색하면 배포한 라이브러리가 검색된다.
사용#
- 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
}