폐쇄망 환경에서 윈도우 PC에 있는 로컬 메이븐 저장소(~/.m2/repository)를 새로 구축한 Nexus Repository로 일괄 업로드하는 방법

폐쇄망 환경에서 윈도우 PC에 있는 로컬 메이븐 저장소(~/.m2/repository)를 새로 구축한 Nexus Repository로 일괄 업로드하는 방법은 크게 두 가지가 있습니다.

가장 효율적인 방법은 **1번(Nexus 서버 자체 임포트)**이며, 서버 접근이 어렵다면 **2번(PowerShell 스크립트)**을 권장합니다.


사전 준비사항

  1. Nexus 설정: Nexus에 maven2 (hosted) 타입의 Repository가 생성되어 있어야 합니다 (예: maven-releases 또는 my-internal-repo).

  2. Deployment 권한: 업로드할 사용자 계정에 업로드 권한이 있어야 합니다 (기본 admin 계정 권한).


방법 1: Nexus 서버의 ‘Import’ 기능 사용 (가장 빠름)

서버에 파일을 직접 옮길 수 있다면 이 방법이 가장 정확하고 빠릅니다.

  1. 파일 복사: 윈도우의 C:\Users\사용자\.m2\repository 폴더 전체를 압축하여 Nexus 서버의 임의 폴더(예: /tmp/m2-backup)로 옮긴 후 압축을 풉니다.

  2. Nexus 접속: 관리자 계정으로 로그인합니다.

  3. Task 생성:

    • Administration (톱니바퀴) -> System -> Tasks 선택.

    • Create Task 버튼 클릭 -> Repository – Import 선택.

  4. Task 설정:

    • Task namem2-import

    • Source directory: 파일이 있는 경로 입력 (예: /tmp/m2-backup).

    • Repository: 파일을 넣을 대상 maven-hosted 저장소 선택.

  5. 실행Create Task 후 목록에서 해당 Task를 선택하고 Run을 클릭합니다.


방법 2: PowerShell 스크립트로 업로드 (클라이언트 PC에서 실행)

서버에 직접 파일을 옮길 수 없을 때, 윈도우 PC에서 Nexus API를 호출하여 업로드하는 방식입니다. SSL 인증서를 무시하고 업로드하도록 작성되었습니다.

1. 스크립트 작성 (upload.ps1)

아래 코드를 복사하여 upload.ps1 파일을 만듭니다.

Powershell

# --- 설정 부분 ---
$NEXUS_URL = "http://<NEXUS_IP>:<PORT>/service/rest/v1/components?repository=<REPO_NAME>"
$USERNAME = "admin"
$PASSWORD = "admin123"
$M2_PATH = "$HOME\.m2\repository"

# SSL 인증서 검증 무시 (Self-signed 인증서용)
add-type @"
    using System.Net;
    using System.Security.Cryptography.X509Certificates;
    public class TrustAllCertsPolicy : ICertificatePolicy {
        public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem) {
            return true;
        }
    }
"@
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy

# 인증 정보 생성
$auth = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("${USERNAME}:${PASSWORD}"))
$headers = @{ Authorization = "Basic $auth" }

# .pom 파일을 찾아서 순회 (pom이 있어야 메이븐 좌표 확인 가능)
Get-ChildItem -Path $M2_PATH -Filter *.pom -Recurse | ForEach-Object {
    $pomFile = $_.FullName
    $jarFile = $pomFile.Replace(".pom", ".jar")
    
    # JAR 파일이 없는 경우도 있으므로 체크
    if (Test-Path $jarFile) {
        Write-Host "Uploading: $($_.Name)" -ForegroundColor Cyan
        
        # Nexus API 호출 (Multipart Form Data)
        curl.exe -u "${USERNAME}:${PASSWORD}" -k -X POST "$NEXUS_URL" `
            -F "maven2.asset1=@$jarFile" -F "maven2.asset1.extension=jar" `
            -F "maven2.asset2=@$pomFile" -F "maven2.asset2.extension=pom"
    }
}

2. 실행 방법

  1. PowerShell을 관리자 권한으로 엽니다.

  2. Set-ExecutionPolicy RemoteSigned (스크립트 실행 권한 허용)

  3. .\upload.ps1 실행


방법 3: Maven settings.xml 설정 후 일괄 배포

폐쇄망 환경에서 윈도우 PC에 있는 로컬 메이븐 저장소(~/.m2/repository)를 새로 구축한 Nexus Repository로 일괄 업로드하는 방법

이미 프로젝트가 구성되어 있다면 Maven 자체 기능을 이용할 수 있습니다.

1. ~/.m2/settings.xml 수정 (인증 및 SSL 무시)

Xml

<settings>
  <servers>
    <server>
      <id>my-nexus</id>
      <username>admin</username>
      <password>admin123</password>
    </server>
  </servers>
</settings>

2. SSL 무시 설정 (HTTP를 사용하거나 Self-signed인 경우)

메이븐 실행 시 다음 파라미터를 추가합니다:
-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true

3. 개별 파일 업로드 (참고용)

특정 중요 라이브러리만 올릴 때는 아래 명령어를 사용합니다.

Bash

mvn deploy:deploy-file -DgroupId=com.example -DartifactId=my-lib -Dversion=1.0 -Dpackaging=jar -Dfile=my-lib-1.0.jar -DrepositoryId=my-nexus -Durl=http://<NEXUS_IP>:8081/repository/maven-releases/ -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true

요약 및 추천

  • 파일 양이 많다(GB 단위): **방법 1 (Nexus Import Task)**을 무조건 추천합니다. 네트워크 부하가 없고 가장 빠릅니다.

  • 서버 접근 권한이 없다: **방법 2 (PowerShell + curl)**가 가장 현실적입니다. 윈도우에는 기본적으로 curl이 포함되어 있어 실행이 간편합니다.

  • SSL 문제: 스크립트 내의 -k 옵션(curl)이나 TrustAllCertsPolicy 설정을 통해 무시할 수 있습니다.

주의: 폐쇄망에서 Nexus를 처음 세팅했다면, Central 프록시 저장소는 인터넷이 안 되어 작동하지 않으므로, 반드시 모든 라이브러리를 Hosted 저장소에 올리고 개발자들의 settings.xml에서 mirror 설정을 해당 Nexus로 잡아주어야 합니다.