티스토리 뷰

 

 


Maven 중앙 저장소에 라이브러리 등록부터 배포까지 알아보겠습니다.

 

 

1. Maven 저장소 회원가입 📚


먼저, Maven 저장소( https://central.sonatype.com/ )에 회원가입해야 합니다.

회원가입이 완료되면 Publish 클릭하여 Namespace를 자동으로 등록해 주는 것을 확인할 수 있습니다.



 

2. GPG 키 생성 및 다운로드 🕐


Maven 중앙 저장소에 배포하려면 GPG 키를 생성하여 라이브러리에 서명해야 합니다.

생성하는 이유는 라이브러리의 무결성과 신뢰성을 보장하기 위해 키를 생성해서 서명하기 위함입니다.

 

 

[ GPG 다운로드 및 설치 ]

설치하는 사이트 https://gnupg.org/download/index.html#sec-1-2 클릭하여 자신의 운영체제에 맞는 걸로 설치하면 됩니다.


저는 mac 사용하고 있어서 밑에 사진들은 mac 환경 기준입니다.

 

 

[ GPG 키 생성 ]

설치한 GPG 에서 새로운 키를 생성합니다.

기존에 입력한 패스워드를 사용하기 위해 Use Simple Password 클릭합니다.

Upload Public Key를 눌러줍니다.


Public Key 키를 업로드하면, 자동으로 keys.openpgp.org 사이트에 업로드가 됩니다.


보통 공캐 키 서버는 3개가 있습니다. 그 중에서 2번째 서버로 업로드가 되었네요.

메일로 자동으로 키가 업로드 됐다고 알려주네요 !


지금까지 gpg 계정과 Public Key 가 생성되었습니다.


이제 Secrey Key를 만들어보겠습니다.

 

 

 

[ Secrey Key 생성 ]

gpg --export-secret-keys 5D5A9392 > /Users/jinseong/Downloads/gpg/gpg-key.asc

메일로 온 OpenPGP 키에서 끝 8자리만 추출한 다음, 비밀 키를 추출합니다. 


"/Users/jinseong/Downloads/gpg/gpg-key.asc" 이 값은 자신의 컴퓨터에 저장하려는 경로입니다. 


저는 gpg 폴더에 gpg-key.asc 파일명으로 저장해두었습니다.


이렇게 GPG 계정과 Public Key, Secret Key 생성이 완료되었습니다.

 

 

 

 

 

3. 프로젝트 Gradle 설정 😊


라이브러리를 배포하려면 build.gradle 또는 pom.xml 파일에 설정을 추가해야 합니다.


저는 gradle 사용하고 있어서 build.gradle 수정해보겠습니다.

 

[ 플러그인 추가 ]

plugins {
    id "com.vanniktech.maven.publish" version "0.28.0" // 대체 플러그인
    id 'signing' // GPG 서명을 위한 플러그인 추가
}

라이브러리를 Maven Central에 배포하기 위해 com.vanniktech.maven.publish 플러그인을 사용하며, 배포 시 필요한 GPG 서명을 위해 signing 플러그인을 추가합니다.

 

 

[ Maven Central 배포 설정 ]

import com.vanniktech.maven.publish.SonatypeHost
 
mavenPublishing {
  publishToMavenCentral(SonatypeHost.CENTRAL_PORTAL)
 
  signAllPublications()
}

Maven Central에 라이브러리를 배포하도록 설정하는 코드입니다.

  • publishToMavenCentral(..): Sonatype Central을 통해 Maven Central에 업로드하도록 지정
  • signAllPublications(): 배포되는 모든 아티팩트에 GPG 서명을 추가

 

 

 

[ POM 설정 ]

mavenPublishing {
    publishToMavenCentral(SonatypeHost.CENTRAL_PORTAL)
    signAllPublications()
    
    coordinates("io.github.coorr", "excel-common", "0.0.1")

    // POM 설정
    pom {
        name = 'excel-common'
        description = 'SpringBoot common maven validation enums'
        url = '<https://github.com/coorr/excel-common>'

        // 라이선스 정보
        licenses {
            license {
                name = 'The Apache License, Version 2.0'
                url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
            }
        }

        // 개발자 정보
        developers {
            developer {
                id = 'coorr'
                name = 'JinSeong Kim'
                email = 'wlsdiqkdrk@gmail.com'
            }
        }

        scm {
            connection = 'scm:git:github.com/coorr/excel-common.git'
            developerConnection = 'scm:git:ssh://github.com:coorr/excel-common.git'
            url = '<https://github.com/coorr/excel-common/tree/master>'
        }
    }
}

이 코드는 라이브러리를 Maven Central에 배포할 때 필요한 메타데이터(POM 파일)를 설정하는 부분입니다.

  • coordinates("io.github.coorr", "excel-common", "0.0.1"): 배포될 라이브러리의 그룹 ID, 아티팩트 ID, 버전을 지정
  • pom : 라이브러리의 메타데이터를 정의합니다.
    • name, description, url: 라이브러리 이름, 설명, 프로젝트 URL을 설정
    • licenses : 라이브러리의 라이선스를 정의 (Apache 2.0)
    • developers : 라이브러리 개발자의 정보를 추가 (이름, 이메일 등)
    • scm : 소스 코드 관리 정보를 설정 (GitHub 저장소 URL 및 연결 방식)

 

 

 

[ 라이브러리 배포 설정 ]

라이브러리 배포를 할려면 Gradle 빌드 설정 파일에서 라이브러리 배포 및 GPG 서명을 추가해야 합니다.

 

gradle.properties

mavenCentralUsername= ..
mavenCentralPassword= ..

signing.keyId= 5D5A9392
signing.password= ..
signing.secretKeyRingFile= /Users/jinseong/Downloads/gpg/gpg-key.asc

mavenCentralUsername, mavenCentralPassword 값은 Maven 저장소의 계정이 아닌 따로 임시 토큰을 생성해서 넣어야 합니다.



Ok 를 누르면 나오는 mavenCentralUsername 과 mavenCentralPassword 를 각각 작성하시면 됩니다. 


그 다음 signing.keyId, password, secretKeyRingFile 부분은 GPG 서명하는 부분입니다.

 

  • signing.keyId=5D5A9392: 아까 위에서 비밀키를 추출할 때 쓰였던 Key ID
  • signing.password=...: GPG 키를 생성할 때 계정에 대한 Password
  • signing.secretKeyRingFile= 아까 위에서 Key ID 통해서 비밀 키를 저장했던 경로


참고로 Github 에 올리실 때 이 보안 정보는 올리시면 안됩니다 !


.gitignore 파일에 gradle.properties 추가해서 다른 사용자가 사용하지 못하도록 해야합니다.

 

 

 

 

[ Maven 배포하기 ]

인텔리제이에서 publishAllPublicationsToMavenCentralRepository 클릭하여 배포합니다.

./gradlew publishAllPublicationsToMavenCentralRepository

만약 인텔리제이가 아닌 경우 명령어로 배포해야 합니다.

 

 

Execution failed for task ':compileJava'.
> Could not resolve all files for configuration ':compileClasspath'.
   > Could not find org.apache.poi:poi:.
     Required by:
         root project :
   > Could not find org.apache.poi:poi-ooxml:.
     Required by:
         root project :

Possible solution:
 - Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html

배포하니깐 오류가 발생하였는데, 이 오류를 확인해본 결과 dependencies 에서 라이브러리의 버전을 기입하지 않아서 실패했습니다.


특정 라이브러리 버전이 존재하지 않으면 Could not resolve 오류가 발생합니다. 

 

 

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'

	// Apache POI
	implementation 'org.apache.poi:poi:5.2.3'  // 버전 기입
	implementation 'org.apache.poi:poi-ooxml:5.2.3'  // 버전 기입
    ...
}

버전 기입을 하고 다시 재배포하였습니다.

 

 

정상적으로 배포되면 이런 화면으로 나오게 됩니다. 초록색을 보면 기분이 좋네요ㅎㅎ

 



이제 실제로 Maven 배포가 되었는지 확인해보겠습니다.

Maven central 사이트의 Deployments를 확인해 보면 Drop 과 publish 버튼이 활성화가 됩니다. 


잘못 배포한 경우 Drop을 눌러 지워주시면 되고 Publish 버튼을 눌러 라이브러리 발행을 계속 진행합니다.


대략 1분 정도 지나니깐 초록색으로 Published 되었습니다.



 

[ Maven 배포 확인 ]

배포 후 라이브러리가 정상적으로 등록되었는지 Maven Repository에서 확인해보겠습니다.

사이트의 Search 검색을 통해 등록한 라이브러리 정보를 확인할 수 있습니다. 




이제 사용할 프로젝트에서 의존성을 추가해준다면 여러 프로젝트에서 사용 가능한 라이브러리 배포가 완료됩니다.