-
POM 레퍼런스 정리카테고리 없음 2019. 3. 31. 01:19
POM 레퍼런스
- 소개
- POM이란 무엇인가?
- pom.xml 구조
- 기초
- 메이븐의 프로젝트 좌표
- POM내의 프로젝트간 관계
- 의존성
- 의존성 버전 규칙
- 상속
- 의존성
아파치 메이븐 - 자바용 프로젝트 관리 도구
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는 필수는 아니지만 로컬 및 원격 리포지토리를 검색하기 전에 프로젝트의 부모에 대해 지정된 경로를 먼저 검색
댓글
- 소개