변경사항 버전 관리 목적으로 회사 디자인 시스템을 기존 프로젝트에서 빼내어 라이브러리 형태로 만드는 작업을 했다.
maven central로 배포하는 방법에 대해 다뤄보고자 한다.
샘플 코드는 SDG(Shopl-Design-Guide)를 참고하면 된다.
메이븐 저장소(Maven Repository)는 프로젝트 관리 도구인 Apache Maven의 서비스 중 하나임
메이븐은 JAR용으로 만들어진 도구지만 메이븐 저장소는 AAR 저장용으로도 많이 사용된다.
서드파티에서 제공하는 GUI 관리도구를 활용하면 편하게 메이븐 저장소를 이용할 수 있다.
기존에는 Sonatype 사가 제공하는 Nexus Repository Manager가 있었다.
기존에는 OSSRH(HTTP PUT) 퍼블리싱 엔드포인트를 사용했지만,
이제부터는 central-portal을 이용해야한다.


깃허브로 로그인 시 group id는 자동 생성된다.



토근 생성 시 기존 토큰은 무효화되니, 생성 직후 표시되는 userName/password 값은 반드시 저장해야 한다.
Maven Central에 라이브러리를 배포하기 위해서는 GPG 키가 필요하다.
이 키는 라이브러리가 정상적으로 서명되었음을 보증하며, 사용자들이 서명을 검증할 수 있도록 공개 키 서버에 업로드된다.
GPG 키를 생성하고 다음 명령어를 사용하여 키 생성 프로세스를 시작한다.
$ gpg --full-generate-key
각자의 목적에 맞게 골라서 사용하면 된다

키 생성이 완료되면 다음과 같은 메시지가 나온다.

여기서 pub의 마지막 8자인 47C2E592가 public key이다.
public key를 다른 사람들이 사용할 수 있도록 GPG public key를 서버에 업로드한다.
$ gpg --keyserver keyserver.ubuntu.com --send-keys 47C2E592
vanniktech 플러그인에서는 secretKeyRingFile을 통해서 GPG를 검증하여 서명에 사용하기 때문에 다음처럼 서명 파일을 생성해야한다.
gpg --keyring secring.gpg --export-secret-keys > ~/.gnupg/secring.gpg
Maven Central에 배포하려면 그래들 파일에서 설정을 해줘야한다.
플러그인은 다른 것도 있지만 vanniktech Maven Publish 플러그인을 적용했다.
모듈 단위의 build.gradle에 플러그인을 추가한다.
plugins {
// id("com.vanniktech.maven.publish") version "0.29.0"
alias(libs.plugins.vanniktech.maven)
}
플러그인을 적용한 후, Maven Central로 배포를 활성화 하려면 대상 저장소를 지정하고 GPG 서명을 활성화해야 한다.
이 설정은 DSL을 통해 추가하거나 Gradle 속성을 설정하여 추가할 수 있다.
import com.vanniktech.maven.publish.SonatypeHost
mavenPublishing {
// 기본 Maven Central로 배포
publishToMavenCentral(SonatypeHost.DEFAULT)
// 또는 https://s01.oss.sonatype.org로 배포
publishToMavenCentral(SonatypeHost.S01)
// 또는 https://central.sonatype.com/를 사용하는 Central Portal로 배포
publishToMavenCentral(SonatypeHost.CENTRAL_PORTAL)
// 모든 배포에 대해 GPG 서명 활성화
signAllPublications()
}
위 설정에서 적절한 옵션을 선택하여 배포할 호스트를 지정할 수 있다.
이번에는 publishToMavenCentral(SonatypeHost.CENTRAL_PORTAL) 를 사용했다.
mavenPublishing {
// 프로젝트의 그룹 ID, 아티팩트 ID, 버전 설정
coordinates("io.github.xxx", "my-library", "1.0.0")
// POM 정보 설정
pom {
name.set("My-Library") // 라이브러리 이름
description.set("My Library") // 라이브러리 설명
url.set("https://github.com/Songgyubin/My-Library") // 프로젝트 URL
inceptionYear.set("2025") // 프로젝트 시작 연도
// 라이선스 정보 설정
licenses {
license {
name.set("The Apache License, Version 2.0")
url.set("http://www.apache.org/licenses/LICENSE-2.0.txt")
distribution.set("http://www.apache.org/licenses/LICENSE-2.0.txt")
}
}
// 개발자 정보 설정
developers {
developer {
id.set("Songgyubin") // 개발자 ID
name.set("Gyubin") // 개발자 이름
url.set("https://github.com/Songgyubin") // 개발자 URL
}
}
// 소스 코드 관리(SCM) 정보 설정
scm {
url.set("https://github.com/SongGyubin/My-Library")
connection.set("scm:git:git://github.com/Songgyubin/My-Library.git")
developerConnection.set("scm:git:ssh://git@github.com:Songgyubin/My-Library.git")
}
}
}
프로젝트 루트 단위의 gradle.properties에 다음 내용을 추가한다.
mavenCentralUsername= Maven Central token 의 username
mavenCentralPassword= Maven Central token 의 password
signing.keyId=12345678 # key 의 id
signing.password=paswword # key 의 패스워드
signing.secretKeyRingFile=/Users/guest/.gnupg/secring.gpg # secring.gpg 의 경로
import com.vanniktech.maven.publish.SonatypeHost
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.jetbrains.kotlin.android)
alias(libs.plugins.compose.compiler)
alias(libs.plugins.vanniktech.maven) // 추가
}
group = "io.github.xxx"
version = "0.0.0"
android {
. . .
}
dependencies {
. . .
}
mavenPublishing {
publishToMavenCentral(SonatypeHost.CENTRAL_PORTAL)
signAllPublications()
coordinates("io.github.xxx", "my-library", "0.0.0")
pom {
name = "My-Library"
description = "My Library"
url = "https://github.com/Songgyubin/My-Library"
inceptionYear = "2025"
licenses {
license {
name = "The Apache License, Version 2.0"
url = "http://www.apache.org/licenses/LICENSE-2.0.txt"
}
}
developers {
developer {
id = "Songgyubin"
name = "Gyubin"
url = "https://github.com/Songgyubin"
}
}
scm {
url.set("https://github.com/Songgyubin/My-Library")
connection.set("scm:git:git://github.com/Songgyubin/My-Library.git")
developerConnection.set("scm:git:ssh://git@github.com/Songgyubin/My-Library.git")
}
}
}
이제 Maven Central에 배포하면 된다.
./gradlew publishAndReleaseToMavenCentral --no-configuration-cache
배포 전 테스트용으로 로컬에 배포할 수도 있다.
./gradlew publishToMavenLocal --no-configuration-cache