Maven Repository 유형

Apache Maven은 Dependency를 자동으로 다운로드하고 JAR 파일들을 보관하기 위해서 Maven Repository를 활용합니다. 다음은 Maven Repository를 설명한 도식입니다.


Repository 유형설명
Local Repository
  • Maven을 사용하는 노트북/PC/서버에 생성됩니다.
  • Remote Repository 또는 Central Repository에서 Dependency를 다운로드하여 저장하고 저장한 파일을 빌드시 사용합니다.
Remote Repository
  • Maven을 사용하는 노트북/PC/서버가 아닌 HTTP 등의 프로토콜을 통해서 접근가능한 회사내/외 Maven Repository 서버입니다.
  • 일반적으로 회사내에 별도의 Maven Repository를 위한 서버를 구성하게 되며 이 서버도 Remote Repository가 될 수 있으며 그 외 인터넷을 통해 타 회사 또는 타 조직에서 제공하는 Maven Repository도 될 수 있습니다.
  • Remote Repository는 있을 수도 있고 없을 수도 있으며 없어도 상관없습니다.
  • 회사내에 구성을 할 때에는 다음의 방식으로 구성할 수 있습니다.
    • Apache HTTPD 웹 서버를 설치하고 Local Repository의 내용을 서버로 업로드하여 구축합니다.
    • Nexus Maven Repository 서버를 설치하여 구성합니다.
Central Repository
  • https://repo1.maven.org/maven2/ 인 Maven Repository입니다.
  • 대부분의 오픈소스 및 라이브러리들이 이 Central Repository에 등록되어 있습니다.
  • Maven은 기본적으로 Central Repository에서 모든 것을 다운로드합니다.

회사내 Maven Repository를 설치해서 사용하는 경우

회사내 Maven Repository를 이용하는 경우는 크게 다음 세 가지입니다.

  • 회사내 소스코드의 빌드한 결과물(artifact)를 별도로 관리하는 경우 → 사내 Maven Repository(아래에서는 Remote Repository)에만 등록하여 사용합니다.
  • Maven Repository를 빠르게 접근하여 사용하고자 하는 경우 → Central Repository 보다 사내 Maven Repository가 훨씬 네트워크가 빠릅니다.
  • Central Repository에 없는 별도의 JAR 파일들을 별도로 관리해야 하는 경우 → 사내 Maven Repository에 별도로 등록하여 사용합니다.

다음의 도식은 사내 Maven Repository(=Maven Remote Repository)를 구축하고 Maven Remote Repository가 Central Repository의 Proxy로 동작하도록 구성한 사례입니다.

Maven의 Repository를 활용하는 동작 순서

다음은 Maven을 이용하여 빌드시 Maven이 Maven Repository를 활용하는 방식에 대한 도식입니다.


  1. 개발자는 프로젝트의 Maven POM에 다양한 형태의 라이브러리를 추가합니다.
  2. 개발자는 프로젝트의 소스코드에 추가한 라이브러리를 import하여 소스코드를 작성합니다.
  3. 자바 소스코드를 컴파일합니다.
  4. 소스코드를 컴파일 하기 위해서 Maven이 호출됩니다.
  5. Maven은 pom.xml 파일(Maven POM)을 로딩하여 dependency를 확인합니다.
  6. Maven은 Maven POM에 등록되어 있는 dependency를 local repository에 있는지 확인합니다.
  7. 없는 경우 Central Maven Repository에서 다운로드합니다. (만약에 Remote Repository를 추가했다면 Remote Repository에서 먼저 다운로드를 시도합니다)
  8. Maven은 다운로드한 dependency를 이용하여 빌드한 후 바이너리 파일을 생성합니다.

Local Repository의 구조

Local Repository는 다음과 같이 사용자의 홈 디렉토리 아래에 .m2/repository 디렉토리에 구성되며 Maven을 실행할때 자동으로 생성됩니다. 그리고 dependency를 다운로드한 후에는 다음과 같이 디렉토리를 구성합니다.

# cd ~/.m2/repository
# tree | head -100                                                                                                                                                                                             .
├── antlr
│   └── antlr
│       ├── 2.7.2
│       │   ├── _remote.repositories
│       │   ├── antlr-2.7.2.jar
│       │   ├── antlr-2.7.2.jar.sha1
│       │   ├── antlr-2.7.2.pom
│       │   └── antlr-2.7.2.pom.sha1
│       └── 2.7.7
│           ├── _remote.repositories
│           ├── antlr-2.7.7-sources.jar.lastUpdated
│           ├── antlr-2.7.7.jar
│           ├── antlr-2.7.7.jar.sha1
│           ├── antlr-2.7.7.pom
│           └── antlr-2.7.7.pom.sha1
├── aopalliance
│   └── aopalliance
│       └── 1.0
│           ├── _remote.repositories
│           ├── aopalliance-1.0-sources.jar
│           ├── aopalliance-1.0-sources.jar.sha1
│           ├── aopalliance-1.0.jar
│           ├── aopalliance-1.0.jar.sha1
│           ├── aopalliance-1.0.pom
│           └── aopalliance-1.0.pom.sha1
... 생략

Group ID와 Artifact ID에 따른 Local Repository 구성

Maven POM에 다음과 같이 2개의 dependency를 저장했다고 가정하겠습니다.

<dependency>
    <groupId>antlr</groupId>
    <artifactId>antlr</artifactId>
    <version>2.7.2</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

Local Repository에 dependency를 저장할 때에는 Group ID, Artifact ID, Version에 따라서 다음과 같이 저장합니다.

├── antlr                                               >> Group ID : antlr
    └── antlr                                           >> Artifact ID : antlr
        ├── 2.7.2                                       >> Version : 2.7.2
        │   ├── _remote.repositories
        │   ├── antlr-2.7.2.jar
        │   ├── antlr-2.7.2.jar.sha1
        │   ├── antlr-2.7.2.pom
        │   └── antlr-2.7.2.pom.sha1
        └── 2.7.7
            ├── _remote.repositories
            ├── antlr-2.7.7-sources.jar.lastUpdated
            ├── antlr-2.7.7.jar
            ├── antlr-2.7.7.jar.sha1
            ├── antlr-2.7.7.pom
            └── antlr-2.7.7.pom.sha1

├── ch
    └── qos
        └── logback                                     >> Group ID : ch.qos.logback
            └── logback-classic                         >> Artifact ID : logback-classic
                └── 1.2.3                               >> Version : 1.2.3
                    ├── _remote.repositories
                    ├── logback-classic-1.2.3-sources.jar
                    ├── logback-classic-1.2.3-sources.jar.sha1
                    ├── logback-classic-1.2.3.jar
                    ├── logback-classic-1.2.3.jar.sha1
                    ├── logback-classic-1.2.3.pom
                    └── logback-classic-1.2.3.pom.sha1

Remote Repository 추가하기

Maven POM에 아래와 같이 repository를 추가하여 사용할 수 있습니다.

<project ...>
   <dependencies>
      <dependency>
         <groupId>com.companyname.common-lib</groupId>
         <artifactId>common-lib</artifactId>
         <version>1.0.0</version>
      </dependency>
   <dependencies>
   <repositories>
      <repository>
         <id>companyname.lib1</id>
         <url>http://download.companyname.org/maven2/lib1</url>
      </repository>
      <repository>
         <id>companyname.lib2</id>
         <url>http://download.companyname.org/maven2/lib2</url>
      </repository>
   </repositories>
</project>

Local Repository는 어디에 있을까?

각 개발자의 Local Repository는 로그인한 사용자의 홈 디렉토리($USER_HOME/.m2/repository)에 구성됩니다. 다만, 이를 변경하기 위해서는 다음과 같이 local repository를 지정할 수 있습니다. 보통은 권장하지 않습니다.

$USER_HOME/.m2/settings.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">
      <localRepository>C:/MyLocalRepository</localRepository>
</settings>