ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • POM 레퍼런스 정리
    카테고리 없음 2019. 3. 31. 01:19

    POM 레퍼런스

    1. 소개
      1. POM이란 무엇인가?
      2. pom.xml 구조
    2. 기초
      1. 메이븐의 프로젝트 좌표
      2. POM내의 프로젝트간 관계
        1. 의존성
          1. 의존성 버전 규칙
        2. 상속

    아파치 메이븐 - 자바용 프로젝트 관리 도구

    1.1 POM이란 무언인가?

    • "Project Object Model" 의 약자로 메이븐 프로젝트에는 항상 pom.xml이란 XML파일이 있음
    • pom.xml에는 프로젝트와 관련된 설정이 존재함

    1.2 pom.xml 구조

    <project xmlns="http://maven.apache.org/POM/4.0.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                          http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
     
      <!-- The Basics -->
      <groupId>...</groupId>
      <artifactId>...</artifactId>
      <version>...</version>
      <packaging>...</packaging>
      <dependencies>...</dependencies>
      <parent>...</parent>
      <dependencyManagement>...</dependencyManagement>
      <modules>...</modules>
      <properties>...</properties>
     
      <!-- Build Settings -->
      <build>...</build>
      <reporting>...</reporting>
     
      <!-- More Project Information -->
      <name>...</name>
      <description>...</description>
      <url>...</url>
      <inceptionYear>...</inceptionYear>
      <licenses>...</licenses>
      <organization>...</organization>
      <developers>...</developers>
      <contributors>...</contributors>
     
      <!-- Environment Settings -->
      <issueManagement>...</issueManagement>
      <ciManagement>...</ciManagement>
      <mailingLists>...</mailingLists>
      <scm>...</scm>
      <prerequisites>...</prerequisites>
      <repositories>...</repositories>
      <pluginRepositories>...</pluginRepositories>
      <distributionManagement>...</distributionManagement>
      <profiles>...</profiles>
    </project>

    2 기초

    • POM에는 프로젝트에 대한 모든 필요한 정보와 빌드 프로세스 중에 사용되는 플러그인의 구성이 포함
    <project xmlns="http://maven.apache.org/POM/4.0.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                          http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
     
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>my-project</artifactId>
      <version>1.0</version>
    </project>

    2.1 메이븐의 프로젝트 좌표

    • 위에 정의된 POM은  메이븐을 사용하기 위한 최소 정의 
    • groupId:artifactId:version은 모두 필수 필드(단, 부모로부터 상속된 경우 groupId와 version 생략 가능)
    • 3개의 필드는 하나의 주소와 타임스탬프처럼 동작 하여, Maven프로젝트를 위한 좌표 시스템의 특정 위치를 표시
    • groupId: 조직이나 프로젝트간에 고유한 값.
      • 예를 들어, 모든 코어 메이븐 아티팩트는 org.apache.maven groupId 아래 위치.
      • groupId는 junit 프로젝트처럼 점 표기법(dot notation)이 아닌 방법도 가능
      • 점으로 표시된 groupId는 프로젝트에 포함된 패키지 구조와 반드시 일치할 필요는 없지만, 관습적으로 따르는 것으 좋은 습관
      • 그룹이 리포지토리에 저장될 때 운영체제 내에서 자바 패키지 구조와 유사하게 동작
      • 점으로 구분된 경로는 운영체제의 디렉토리 구조에 맞게 대체(위의 예에서 "org.codehaus.mojo"그룹은 "$M2_REPO/org/codehaus/mojo" 디렉토리에 있음)
    • artifactId: 프로젝트 이름
      • 그룹 내에서 프로젝트의 고유한 이름
      • groupId와 함께 프로젝트를 다른 모든 프로젝트와 분리하는 키
      • 위의 예에서 my-project는  "$M2_REPO/org/codehaus/mojo/my-project"에 위치
    • version: 버전
      • 동일한 프로젝트 내의 코드 분리 목적
      • my-project의 버전 1.0는 "$M2_REPO/org/codehaus/mojo/my-project/1.0"에 위치

    패키징

    • groupId:artifactId:version 이외에 프로젝트를 나타내는 레이블이 프로젝트의 패키징
    • 위의 org.codehaus.mojo:my-project:1.0 POM의 예에서는 jar로 패키징됨
    • 아래와 같이 war로 다른 패키징 가능
    <project xmlns="http://maven.apache.org/POM/4.0.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                          http://maven.apache.org/xsd/maven-4.0.0.xsd">
      ...
      <packaging>war</packaging>
      ...
    </project>
    • 패키징 선언 생략 시 기본 패키징: jar
    • 가능한 패키징 선언: pom, jar, maven-plugin, ejb, war, ear, rar

    2.2 POM내의 프로젝트간 관계

    • 메이븐의 강력한 기능 중 하나는 프로젝트 간의 관계 처리: 여러 프로젝트 모듈간 의존성, 상속 그리고 집계

    2.2.1 의존성

    • POM의 초석은 의존성 리스트
    • 대부분의 프로젝트는 다른 프로젝트에 의존성을 가지고 빌드되고 실행
    • 메이븐은 컴파일을 비롯한 필요한 시점에 의존성을 다운로드하고 링크
    <project xmlns="http://maven.apache.org/POM/4.0.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                          https://maven.apache.org/xsd/maven-4.0.0.xsd">
      ...
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
          <type>jar</type>
          <scope>test</scope>
          <optional>true</optional>
        </dependency>
        ...
      </dependencies>
      ...
    </project>
    • groupId, artifactId, version: 이 세가지는 메이븐에서 종속성을 위한 특정 프로젝트를 찾을 때 사용
    • classifier: 동일한 POM으로 작성된 내용이 다른 아티팩트 구분을 위해 사용
      • 아티팩트의 이름 끝 버전 이름에 이어서 임의의 문자열이 추가
      • 이 요소를 사용하는 예로써, JRE1.5를 대상으로 아티팩트를 제공하지만 동시에 JRE1.4를 지원하는 경우
      • 첫번째 classifier는 jdk1.5 이고 두번째는 jdk1.4로 클라이언트가 선택적으로 이용 가능
      • 다른 일반적인 케이스는 프로젝트의 주요 아티팩트외에 보조 아티팩티를 첨부하는 경우
      • 메이븐 중앙 저장소를 살펴보면 classifier를 사용하여 소스와 javadoc을 배포하는 것을 볼 수 있음
    • type: 의존성 타입 지정. 기본값은 jar.
      • 일반적으로 의존성 파일 이름에 대한 확장자지만 다르게 지정도 가능
    • scope: 의존성의 범위를 제한, 아래 5가지 범위 사용 가능
      • compile - 기본 범위를 지정하지 않은 경우 기본값. 컴파일 의존성을 지정한 경우 모든 클래스에서 사용 가능하며 의존성을 가진 프로젝트를 의존한 프로젝트에도 적용
      • provided - compile과 유사하지만 JDK나 컨테이너가 의존성을 런타임에 제공. 컴파일과 테스트 시점에는 이용 가능하지만 전이적인(transitive) 의존성은 가지지 않음
      • runtime - 컴파일 시점에는 의존성이 필요하지 않지만, 실행 시점에 필요한 경우 지정
      • test - 응용프로그램에서는 사용하지 않는 의존성에 대한 설정으로 테스트 컴파일과 실행 단계에서 사용
      • system - JAR를 직접 제공해야 하는 것 빼고는 provided속성과 유사
    • systemPath: scope가 system인 경우 사용
    • optional: 의존성을 참조할 때 상위 의존성을 참조할지 설정. =>는 요구되는 의존성을 나타내며 -->는 옵셔널을 나타냄

    2.2.1.1 의존성 버전 규칙

    • 1.0: 1.0에 대한 "Soft" 요구사항
    • [1.0]: 1.0에 대한 "Hard" 요구사항
    • (,1.0]: x <= 1.0
    • [1.2,1.3]: 1.2 <= x <= 1.3
    • [1.0,2.0): 1.0 <= x < 2.0
    • [1.5,): x >= 1.5
    • (,1.0],[1.2,): x <= 1.0 또는 x >= 1.2; 컴마로 구분된 멀티셋
    • (,1.1),(1.1,): 1.1 제외

    2.2.2 상속

    • 메이븐의 강력한 기능 중 하나인 상속
    <project xmlns="http://maven.apache.org/POM/4.0.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                          https://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
     
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>my-parent</artifactId>
      <version>2.0</version>
      <packaging>pom</packaging>
    </project>
    • 부모와 집계 (멀티 모듈) 프로젝트의 packaging타입은 pom 지정
    • 타입 지정은 라이프사이클 단계의 목표를 정의, 예를 들어 패키징에 jar를 지정하면 패키지 단계는 jar:jar goal을 실행
    • 부모 POM에 추가된 다음의 항목은 자식에게 상속
      • groupId
      • version
      • description
      • url
      • inceptionYear
      • organization
      • licenses
      • developers
      • contributors
      • mailingLists
      • scm
      • issueManagement
      • ciManagement
      • properties
      • dependencyManagement
      • dependencies
      • repositories
      • pluginRepositories
      • build
      • plugin executions with matching ids
      • plugin configuration
      • etc.
      • reporting
      • profiles
    • 다음은 상속되지 않는 항목
      • artifactId
      • name
      • prerequisites
    <project xmlns="http://maven.apache.org/POM/4.0.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                          https://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
     
      <parent>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>my-parent</artifactId>
        <version>2.0</version>
        <relativePath>../my-parent</relativePath>
      </parent>
     
      <artifactId>my-project</artifactId>
    </project>
    • relativePath는 필수는 아니지만 로컬 및 원격 리포지토리를 검색하기 전에 프로젝트의 부모에 대해 지정된 경로를 먼저 검색

    출처 : https://maven.apache.org/pom.html

    댓글

Designed by Tistory.