Theme:

Jenkins 빌드에서 Could not find artifact 에러가 발생한다면, Maven Central에 없는 사내 라이브러리를 참조하고 있을 가능성이 높습니다.

사내 공통 라이브러리나 비공개 의존성을 사용하는 프로젝트는 Nexus(사설 리포지토리) 에서 라이브러리를 다운로드해야 합니다. Nexus 연동 없이는 Maven Central에 없는 라이브러리를 찾지 못해 빌드가 실패합니다.

왜 Nexus 연동이 필요한가

Nexus 연동 설정은 크게 두 부분으로 나뉩니다.

  1. 계정 설정 (settings.xml) - Nexus 접근에 필요한 인증 정보
  2. ** 리포지토리 설정** (pom.xml) - 라이브러리를 다운로드할 Nexus URL 정보

설정 구조 이해

PLAINTEXT
settings.xml (인증 정보)          pom.xml (리포지토리 URL)
┌─────────────────────┐          ┌─────────────────────────┐
│ <server>            │          │ <repository>            │
│   <id>my-nexus</id> │ ←일치→  │   <id>my-nexus</id>     │
│   <username>...</>  │          │   <url>http://nexus...</>│
│   <password>...</>  │          │ </repository>           │
│ </server>           │          └─────────────────────────┘
└─────────────────────┘

** 핵심:** settings.xml<server><id>pom.xml<repository><id>가 ** 반드시 일치 **해야 합니다. Maven은 이 id 값을 기준으로 어떤 인증 정보를 어떤 리포지토리에 적용할지 매칭합니다.

1. 계정 설정 (settings.xml)

Maven이 Nexus에 접근할 때 사용할 인증 정보를 settings.xml에 추가합니다.

** 파일 위치:** $MAVEN_HOME/conf/settings.xml

XML
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                              http://maven.apache.org/xsd/settings-1.0.0.xsd">
    <servers>
        <server>
            <id>nexus-releases</id>
            <username>배포계정ID</username>
            <password>배포계정PW</password>
        </server>
        <server>
            <id>nexus-snapshots</id>
            <username>배포계정ID</username>
            <password>배포계정PW</password>
        </server>
    </servers>
</settings>

** 보안 팁:** 비밀번호를 평문으로 저장하는 것이 우려된다면, Maven의 mvn --encrypt-password 기능을 사용하여 암호화된 비밀번호를 저장할 수 있습니다.

2. 리포지토리 설정 (pom.xml)

빌드 시 의존성을 다운로드할 Nexus 리포지토리 URL을 프로젝트의 pom.xml에 추가합니다.

XML
<repositories>
    <repository>
        <id>nexus-releases</id>
        <name>Nexus Release Repository</name>
        <url>http://nexus.example.com/repository/maven-releases/</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
    <repository>
        <id>nexus-snapshots</id>
        <name>Nexus Snapshot Repository</name>
        <url>http://nexus.example.com/repository/maven-snapshots/</url>
        <releases>
            <enabled>false</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
        </snapshots>
    </repository>
</repositories>

설정 값 매칭 요약

항목settings.xmlpom.xml일치 필요 여부
ID<server><id><repository><id>** 필수 일치**
URL-<repository><url>pom.xml에만 설정
인증 정보<username>, <password>-settings.xml에만 설정

** 참고:** 인증이 필요 없는 공개 리포지토리는 settings.xml<server> 설정을 생략하고, pom.xml<repository>에 URL만 지정하면 됩니다.

트러블슈팅

증상원인해결 방법
401 Unauthorized인증 실패settings.xml의 username/password 확인
Could not find artifact리포지토리 URL 오류 또는 id 불일치pom.xml의 URL과 settings.xml의 id 매칭 확인
SNAPSHOT 버전이 갱신되지 않음캐시된 구버전 참조mvn clean install -U 옵션으로 강제 갱신

정리

항목설명
인증 설정settings.xml<server> 블록
저장소 URLpom.xml<repository> 블록
id 매칭settings.xmlpom.xml의 id가 반드시 일치
비밀번호 보안mvn --encrypt-password로 암호화 가능
SNAPSHOT 갱신-U 옵션 또는 updatePolicy: always
댓글 로딩 중...