Nexus에서 자체 Maven 리포지토리를 구축하고 sbt에서 사용

Scala 현장에서 프로젝트 종속성을 폐쇄된 Maven 리포지토리로 관리할 수 없는가 하는 이야기가 오르기 때문에, 일단 로컬상에서 간이로 검증한 내용을 비망으로 남깁니다.

로컬에 리포지토리 서버 구축



프로덕션 용 리포지토리 서버는 별도로 현장에서 준비됩니다.
로컬 검증은 간편하게 Nexus 공식 Docker 이미지를 사용.

Nexus 서버 생성~로그인



적당히 작업 폴더를 파고 docker-compose.yml 를 아래와 같이 작성.
$ mkdir nexus && cd nexus
$ vim docker-compose.yml

docker-compose.yml
version: '2'
services:
  nexus3:
    image: sonatype/nexus3
    volumes:
      - nexus-data:/nexus-data
    ports:
      - 8081:8081
volumes:
  nexus-data:

만든 후 Docker 컨테이너를 시작하고 자주 기다립니다.
$ docker-compose up -d
Creating network "nexus_default" with the default driver
Creating nexus_nexus3_1 ...
Creating nexus_nexus3_1 ... done

컨테이너의 로그에 아래와 같이 표시되면 기동 완료.
$ docker-compose logs
...
nexus3_1  | -------------------------------------------------
nexus3_1  |
nexus3_1  | Started Sonatype Nexus OSS 3.6.2-01
nexus3_1  |
nexus3_1  | -------------------------------------------------
http://localhost:8081/에 액세스하면 Nexus 관리 콘솔이 표시됩니다.

오른쪽 상단 링크에서 "Sign In"
※기본적으로 다음 관리 사용자/비밀번호가 준비되어 있습니다: [admin/admin123]



⇒로그인 후, 필요에 따라서 「설정」>「Users」로부터 유저를 작성. (이번은 검증용이므로 생략)



Maven 리포지토리 생성



자체 라이브러리를 등록하는 Maven 리포지토리를 만듭니다.

repositories > Create repository > maven2 (hosted)





Snapshot용과 Release용을 각각 작성.





참조용으로 상기 리포지토리를 정리한 그룹을 작성.
repositories > Create repository > maven2 (group)




maven-central 등의 추가는 기호로.

sbt에서 리포지토리 사용



자작한 리포지토리를 Scala 프로젝트에서 이용하려면 build.sbt 에 아래와 같이 설정한다.

build.sbt
organization := "com.example"

name := "scala-libs-sample"

version := "0.0.1-SNAPSHOT"

////////////////////////////////////////////////////////////////////////////////////
// My Hosted Repository
val myrepos = "http://localhost:8081/"
// リポジトリ認証情報 => 後述の[~/.sbt/.credentials]の内容を読み込む
credentials += Credentials(Path.userHome / ".sbt" / ".credentials")

// リポジトリへデプロイする側の設定
publishMavenStyle := true
publishArtifact in Test := false
pomIncludeRepository := { _ => false }
publishTo := {
  if (isSnapshot.value)
    Some("snapshots" at myrepos + "repository/my-snapshots")
  else
    Some("releases"  at myrepos + "repository/my-releases")
}

// モジュールを利用する側の設定
resolvers += "Nexus" at myrepos + "repository/my-repo-group/"
libraryDependencies += "com.example" % "scala-libs-sample" % "0.0.1-SNAPSHOT"

리포지토리 서버의 인증 정보는 홈 디렉토리에 .sbt/.credentials 파일을 작성하여 아래와 같이 기재한다. (※유저명 등은 적절히 변경)

~/.sbt/.credentials
realm=Sonatype Nexus Repository Manager
host=localhost
user=admin
password=admin123

구성에 문제가 없으면 publish 명령으로 서버에 모듈이 배포되어야 함>
$ sbt publish
...
[info]  published scala-libs-sample_2.10 to http://localhost:8081/repository/my-snapshots/com/example/scala-libs-sample_2.10/0.0.1-SNAPSHOT/scala-libs-sample_2.10-0.0.1-SNAPSHOT.pom
[info]  published scala-libs-sample_2.10 to http://localhost:8081/repository/my-snapshots/com/example/scala-libs-sample_2.10/0.0.1-SNAPSHOT/scala-libs-sample_2.10-0.0.1-SNAPSHOT.jar
[info]  published scala-libs-sample_2.10 to http://localhost:8081/repository/my-snapshots/com/example/scala-libs-sample_2.10/0.0.1-SNAPSHOT/scala-libs-sample_2.10-0.0.1-SNAPSHOT-sources.jar
[info]  published scala-libs-sample_2.10 to http://localhost:8081/repository/my-snapshots/com/example/scala-libs-sample_2.10/0.0.1-SNAPSHOT/scala-libs-sample_2.10-0.0.1-SNAPSHOT-javadoc.jar
[success] Total time: 2 s, completed 2017/12/16 23:14:43

좋은 웹페이지 즐겨찾기