::: IT인터넷 :::

Nexus에 Maven 저장소 설정 (for Scala Application)

곰탱이푸우 2023. 7. 10. 08:20
Spark 어플리케이션 개발을 위해 Scala 개발 환경을 구성해야 하는 상황에 직면했다.
 
Scala는 Java 기반의 함수형 언어이며, 빌드하면 Jar 파일이 생성된다.
생성 된 Jar 파일은 개발 단계에 따라 아래와 같이 구분하여 배포한다.
  • 개발 중 버전 - 1.0.0.1-SNAPSHOT 버전을 snapshots 저장소에 배포
  • 개발 완료 버전 - 1.0.0.1 버전을 releases 저장소에 배포

 

개발 산출물은 사설 저장소에 배포할 예정이므로 Nexus에 Maven 사설 저장소를 구축한다.
 
Scala 기반 어플리케이션은 sbt (simple build tool)를 사용하여 빌드한다.
생성한 저장소 주소는 sbt 저장소 주소 설정에 사용하며 자세한 방법은 다음 포스팅 (문서)을 참고한다.

 

 
내부망에서 사설 저장소를 사용하는 경우 Maven 저장소 설정을 먼저 진행해야 한다.
Maven Cetral과 같은 공식 저장소를 사용하는 경우는 해당 저장소를 사용한다.
Nexus의 경우 Java 사설 저장소를 기초로 발전한 시스템이라 Maven 저장소는 기본 옵션으로 제공한다.
따라서 기본적인 설정 몇 가지만 다룬다.
 
pypi, docker, apt, conda 저장소 설정은 아래 블로그를 참고한다.
 

Nexus의 Maven 저장소 설정

Nexus에 관리자 계정으로 접속하고, Nexus 환경 설정 - Repository - Repositories를 클릭한다.
우측 필터에 maven이라고 입력하면 아래와 같은 Maven 저장소 목록이 확인된다.
 
Nexus를 설치하면 기본으로 제공하는 저장소이며, 아래 순서로 저장소의 확인을 진행한다.
  • maven-snapshots (hosted)
  • maven-releases (hosted)
  • maven-central (proxy)
  • maven-public (group)
 
Nexus의 hosted, proxy, groups 개념은 다음과 같다.
  • hosted (Local) - 내부에서 작성한 Java, Scala 패키지인 Jar 파일을 배포한다.
  • proxy (Remote) - 외부의 Maven 저장소의 Jar 패키지를 저장하고 내부 사용자에게 전달한다. 캐시 (Cache) 역할이다.
  • group (Repos) - 다수의 hosted, proxy 저장소를 묶어 단일 경로를 제공한다.
 

maven-snapshots

Java와 Scala 계열에서 Snapshot은 개발 중 버전을 의미한다. Python의 dev 버전과 유사하다.
또한 hosted 저장소이므로 내부에서 배포하는 패키지를 저장하는 저장소이다.
따라서 Snapshots 저장소는 개발중인 버전이 빌드되어 배포되었을 경우 저장되는 저장소이다.
 
maven-snapshots 저장소를 클릭하면 저장소 URL을 확인할 수 있다.

 

아래로 조금 내려보면 실제 저장공간 (Blob store)이 default로 되어 있다.
 
 
좌측의 Blob Stores를 클릭하면 default 저장 공간을 확인할 수 있다.
 
경로는 default로 되어 있고 변경 가능하다.
 
따라서 추가적인 설정 변경 없이 해당 저장소의 주소만 사용하면 된다.
 

maven-releases

Java와 Scala 계열에서 Release는 개발이 완료되어 정식으로 배포 된 버전을 의미한다.
또한 hosted 저장소이므로 내부에서 배포하는 패키지를 저장하는 저장소이다.
따라서 Releases 저장소는 개발이 완료된 버전이 배포되었을 경우 저장되는 저장소이다.
 
나머지 항목은 maven-snapshots 항목과 동일하다.
 
 

maven-central

maven-central은 Java 계열 저장소 중 가장 유명한 저장소 중 하나인 maven 공식 저장소를 의미한다.
구글링을 해보면 Nexus를 만든 sonatype이 Apache Maven 프로젝트의 핵심 Contributor라고 한다.
Nexus에 Maven이 기본 옵션으로 지정되어 있는 이유를 이해할 수 있다.
 
해당 저장소는 proxy로 설정되어 있다.
Nexus의 maven-central은 maven 공식 저장소의 라이브러리들을 중계하는 역할을 담당한다.
 
Repositories에서 설정을 확인해보면 저장소 주소를 확인할 수 있다.
또한 Version Policy 항목에 Release라고 되어 있는데 배포 버전(Release)만 사용하겠다는 의미이다.

 

조금 더 내리면 Remote storage 부분에 maven 공식 저장소 주소가 지정된 것을 확인할 수 있다.
다른 3rd-party Maven 저장소를 추가할 때, Remote storage에 해당 저장소 주소를 입력하면 된다.
 
 
인증서 신뢰 저장소 (truststore)에 추가하기 위해 View certificate를 클릭하고 추가한다.
 
그리고 좌측의 Use certificates stored in... 항목에 체크한다.

 

아래로 조금 내려보면 실제 저장공간 (Blob store)가 default로 되어 있다.
 
해당 Blob Store에 대한 내용은 maven-snapshots 항목을 참고한다.
 
 

maven-public

Nexus에서 확인되는 maven-public은 group 형식의 저장소이다.

 

maven-snapshots, maven-releases, maven-central 저장소를 하나로 묶어서 라이브러리를 제공하는 저장소이다.
Version policy는 Mixed로 되어 있는데 Release 버전 뿐 아니라 maven-snapshots 저장소의 Snapshot 버전도 다운로드 할 수 있다.

 

Blob store는 역시 default를 사용하고 있다.
 
 

3rd-party 저장소 추가

개인적으로 조사한 3rd-party maven 저장소 목록은 다음과 같다.
  • Bintray 같이 운영이 중단 된 저장소와 안드로이드 관련 저장소는 제외
  • Apache Hadoop 생태계와 관련이 있는 저장소만 정리
 
Bintray 중단 관련 내용은 아래 링크를 참고한다.
https://jfrog.com/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/
 

Into the Sunset: Bintray, JCenter, GoCenter, and ChartCenter

To streamline the productivity of the JFrog Platform we will be sunsetting Bintray (including JCenter), GoCenter, and ChartCenter services on May 1st, 2021.

jfrog.com

 

주요 Maven 저장소 목록은 다음과 같다.

더보기

주요 Maven 저장소 목록

아래는 판단 유보

 

maven-central 저장소만 설정했는데 라이브러리를 찾지 못하는 경우 위의 주소를 활용하여 추가한다.
못 찾는 라이브러리가 위치한 저장소는 라이브러리 이름과 버전으로 구글링하면 금방 찾을 수 있다.
 
해당 maven 원격 저장소를 Nexus가 중계하도록 proxy로 설정하고  maven-public (group) 저장소에 추가한다.
이러한 방법은 다음과 같은 장점이 있다.
  • 로컬의 sbt 설정을 변경하지 않아도 된다. (로컬 환경 관리 편리)
  • 특정 저장소가 불필요한 경우 해당 저장소만 골라서 삭제할 수 있다.
 
그러나 아래와 같은 단점도 존재한다.
  • 배포 목적이 아니므로 인터넷 환경에서는 큰 의미가 없다.
  • 추가하는 저장소가 많아지면 관리가 불편해진다.
  • 로컬 저장소에 설정하면 된다.
 
아래 예제는 maven-central-apache 저장소를 추가하는 방법이다.
실제로 중계해야 하는 상황이 아니라면 사용할 일이 많지 않을 것으로 예상된다.
 
 

Blob Store 추가

Blob Store의 default 저장소는 기본으로 제공되는 maven-public, maven-central, maven-releases, maven-snapshots만 사용한다.
 
그 외의 저장소 (3rd party) 를 추가하는 경우 default 대신 개별 저장소마다 Blob Store 추가한다.
  • 나중에 필요가 없어지면 해당 저장소만 삭제하면 됨
  • 패키지를 골라내서 삭제할 필요 없어 편리함 (스토리지 용량 관리)
 
Create Blob Store를 클릭한다.
 
Create Blob Store 창이 출력되면 다음과 같이 입력한다.
  • Type은 File 선택
  • Name은 maven-apache (prefix와 name 지정)
  • Path는 자동 생성
 
Blob Store가 정상적으로 생성되었는지 확인한다.

 

 

Repository 추가

maven-central-apache 저장소를 중계하기 위한 로컬 저장소를 생성한다.
 
Create repository를 클릭한다.
 
maven2 (proxy)를 선택한다.
 
name은 Blob Store와 동일한 maven-apache를 입력하고, Version policy는 Release를 유지한다.

 

 

Remote storage에 apache-maven 저장소 주소를 입력한다.
 
인증서 신뢰 저장소 (truststore)에 추가하기 위해 View certificate를 클릭하고 추가한다.
그리고 좌측의 Use certificates stored in... 항목에 체크한다.
 
Blob store에서는 생성한 maven-apache를 선택한다.

 

하단의 Create repository를 클릭한다.
 
 

maven-public에 추가

group 형태의 maven-public에 생성한 maven-apache 저장소를 추가한다.
로컬 환경에서는 maven-public 설정을 유지하고 다른 설정은 변경하지 않아도 된다.
 
maven-public을 클릭한다.
 
생성한 maven-apache 저장소가 Available 항목에 있는 것을 확인할 수 있다.
 
maven-apache 저장소를 Members 항목으로 이동하고 Save를 클릭한다.