ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 내가 만든 was, Maven에 올렸지
    개발 2024. 7. 20. 19:52

    개요

    우아한 테크 캠프를 진행하면서 was를 직접 개발하는 경험을 했습니다. 3주 동안 고생하며 만든 제 was에 정이 들었는지 실제 maven 서버에 등록하고 싶은 마음이 생겨서 바로 어떻게 올리고 싶었는데 몇 년 전과 비교해서 달라진 게 많고 생각보다 자료를 찾기 어려워서 이틀 동안 매달려서 겨우 성공했습니다...

    여러분들은 쉽고 빠르게 성공할 수 있도록 저의 과정을 자세히 설명해 드리겠습니다.

    올리기 전에 알고 가면 좋은 것

    Maven Central Repository 란?

    Maven Central Repository는 Java 개발자들이 가장 많이 사용하는 공개 아티팩트 저장소입니다. 이 저장소는 수많은 오픈 소스 Java 라이브러리, 프레임워크, 그리고 도구들을 호스팅 하고 있습니다. Sonatype이 운영하며, Apache Maven 프로젝트의 공식 저장소로 인정받고 있습니다.

    우리는 어떤 식으로 외부 프로젝트를 가지고 오는 거지?

    외부 프로젝트를 가져오는 방식은 다음과 같습니다.

    1. pom.xml(Maven) 또는 build.gralde(gradle)을 통한 의존성 선언
    2. 설정된 repository에서 선언된 의존성의 프로젝트를 다운로드한다.
    3. 로컬 저장소(~/. m2/repository)에 캐싱해 재사용할 수 있도록 한다.
    4. 클래스 패스에 자동으로 추가되어 코드에서 바로 사용할 수 있다~

    여기서 조금 알면 좋다고 생각하는 부분은 외부 프로젝트를 가져오는 repository의 정보는 ~/. m2/settings.xml에 저장되어 있습니다. 설정을 수정하면 다른 repository에 있는 정보를 가져올 수 있습니다! 그래서 내부망에서 repository를 구축하면 라이브러리를 쉽게 공유할 수 있도록 할 수 있죠 :)

    아래는 repository 정보를 수정할 수 있는 mirror tag입니다.

    <settings>
      ...
      <mirrors>
        <mirror>
          <id>custom-central</id>
          <name>Custom Central Repository</name>
          <url>https://your-custom-repo-url.com/repo</url>
          <mirrorOf>central</mirrorOf>
        </mirror>
      </mirrors>
      ...
    </settings>

    Maven Central Repository에 올려보기

    이제 Maven에 프로젝트를 올리는 방법에 대해서 설명하겠습니다.

    SonaType Central 가입

    먼저 Maven Central Repository를 운영하는 SonaType에 가입을 진행해야 합니다.
    먼저 여기에서 회원가입을 진행합니다. Github를 통해 가입하는 걸 추천드립니다.

    Namespace 등록

    다음은 Namespace 등록입니다. 이 단계는 2가지의 경우가 존재하는 데 사용하고 있는 도메인을 통한 방법과 github 같은 code hosting service 서비스를 이용하는 방법이 있습니다. 로그인 후 오른쪽 상단의 publish -> add namespace를 누릅니다.

    1. code hosting service
      만약 github를 통해 회원가입을 했고 username.github.io를 등록했다면 자동으로 namespace가 등록이 되는 것 같습니다. 그런 분들은 그냥 사용하시면 되고 만약 없다면 github.com/username/제공받은-인증-키 레포를 만들고 인증을 진행합니다.(이 레포는 인증 후 삭제해도 됩니다.)
    2. 개인 도메인
      개인 도메인을 사용하신다면 custom record를 생성한 후 Type을 TXT 그리고 data를 제공받은 인증 키로 등록하면 끝입니다.

    소스 업로드하기

    소스를 업로드하는 방식은 다양하게 존재합니다. 그러나 저는 쉽지 않았는데요 sonatype은 Gradle을 이용한 업로드 방식을 여러 개 소개합니다.

    가장 상단에 있는 방식이 제가 첫 번째로 시도한 jreleaser인데요... 현재 github 인증 버그가 있는데 실제로 이슈로도 올라와 있고 방법을 찾으려 해도 쉽지 않아서 포기했습니다...

    그다음 제가 시도한 방법은 vanniktech/gradle-maven-publish-plugin입니다.

    gpg 서명

    설명에 앞서 먼저 Central Repository에 올리기 위해서는 GPG로 서명해야 합니다.

    gpg 가 없다면 다음 https://gnupg.org/download/ 사이트 또는 패키지 매니저를 통해 다운로드를 진행합니다.

    gpg 키 생성

    다음 명령어를 통해 키를 생성합니다.

    gpg --gen-key

    이름, 이메일, 코멘트 순으로 설정을 진행합니다.
    그 후 passphrase 입력하면 끝입니다.

    gpg 키 확인

    다음 명령어를 통해 생성된 키를 확인합니다.

    gpg --list-keys
    [keyboxd]
    ---------
    pub   rsa4096 2024-07-20 [SC] [expires: 2025-07-20]
          발급받은_키ID
    uid           [ultimate] 이름 <이메일>
    sub   rsa4096 2024-07-20 [E] [expires: 2025-07-20]

    pub 옆에 발급받은-키 ID 가 생성된 키의 ID입니다.

    공개 키

    다른 사람이 프로젝트를 파악하기 위해 키의 공개키를 서버에 전송해야 합니다.
    주로 keyserver.ubuntu.com, keys.openpgp.org, pgp.mit.edu 에 전송하고 모두 전송해 놓는 게 좋다고 합니다.

    다음 명령어를 통해 키 서버에 전송합니다.

    gpg --keyserver keyserver.ubuntu.com --send-keys 발급받은_키ID

    그리고 잘 올라갔는지 다음과 같이 확인합니다.

    gpg --keyserver keyserver.ubuntu.com --recv-keys 발급받은_키ID

    POM 설정하기

    이제 거의 끝났습니다. 다음으로 프로젝트와 함께 게시될 pom을 설정해야 합니다.

    저는 gradle을 사용해서 gradle 기반으로 설명하겠습니다.

      import com.vanniktech.maven.publish.SonatypeHost
    
      plugins {
        ... 기존 설정
        id "com.vanniktech.maven.publish" version "0.29.0"
        Id 'signing'
      }
      ... 기존 설정
    
      signing { // 배포할 프로젝트에 서명을 추가하는 코드
          useGpgCmd() // 시스템 CLI 를 통해 서명 진행
          sign publishing.publications // publishing.publications 에 정의된 모든 publication에 서명을 추가
      }
    
      mavenPublishing {
    
        // publishToMavenCentral(SonatypeHost.DEFAULT)
        // publishToMavenCentral(SonatypeHost.S01) // https://s01.oss.sonatype.org 에 올리고 싶을 떄
        publishToMavenCentral(SonatypeHost.CENTRAL_PORTAL) // https://central.sonatype.com/ 에 올리고 싶을 떄
    
        coordinates("com.example.mylibrary", "library-name", "1.0.3-SNAPSHOT") // groupId(namespace), artifactId, version(현재 central.sonatype.com 에는 SNAPSHOT을 올릴 수 없음)
    
        pom { // pom 에 나타날 정보
          name = "My Library" // 프로젝트 이름
          description = "A description of what my library does." // 설명
          inceptionYear = "2020" // 시작년도
          url = "https://github.com/username/mylibrary/" // 설명 사이트
          licenses { // 라이센스 정보
            license {
              name = "The Apache License, Version 2.0"
              url = "http://www.apache.org/licenses/LICENSE-2.0.txt"
              distribution = "http://www.apache.org/licenses/LICENSE-2.0.txt"
            }
          }
          developers { // 개발자 정보
            developer {
              id = "username"
              name = "User Name"
              url = "https://github.com/username/"
            }
          }
          scm { // 사용자들이 소스를 찾을 수 있도록 github 등록
            url = "https://github.com/username/mylibrary/"
            connection = "scm:git:git://github.com/username/mylibrary.git"
            developerConnection = "scm:git:ssh://git@github.com/username/mylibrary.git"
          }
        }
      }
    

    다음과 같이 build.gradle을 수정합니다.

    SonaType 정보 입력하기

    다음으로 View Account 에 들어가서

    Generate User Token 을 통해 SonaType의 User Token을 생성합니다.

    그 후 ~/. gralde/gradle.properties 에 다음과 같이 추가합니다. 

    **주의** 프로젝트 내의 .gradle 폴더가 아닌 user.home(~/) 밑의 .gradle 입니다!!

    mavenCentralUsername=생성된_username_token
    mavenCentralPassword=생성된_password_token

    이제 끝

    이제 gradle 명령어를 입력하면 passpharse 를 입력하는 창이 나오고 등록했던 패스워드를 입력하면 완료입니다!!

    ./gradlew publishAllPublicationsToMavenCentralRepository

    빌드가 성공했다면 다시 central.sonatype.com/publishing으로 돌아가면 Deployments에 배포되고 있는 프로젝트를 볼 수 있습니다.

    일정 시간이 지나면 다음과 같이 배포가 끝납니다.

    그리고 repo1.maven.org/maven2/(groupId. 단위로 / 입력)/(articeId)에서 정상적으로 업로드된 것을 확인할 수 있습니다.

    마무리

    여기까지가 저의 이틀 동안의 삽질의 결과입니다..ㅎㅎ 여러분은 쉽고 간단하게 프로젝트를 maven에 업로드하길 바랍니다!!

     

    참고 문서

    - https://vanniktech.github.io/gradle-maven-publish-plugin/central/#configuring-maven-central

    댓글

Designed by Tistory.