Maven 참조 설정 파일
- settings.xml
- settings.xml은 maven tool 자체에 관련된 설정을 담당
- MAVEN_HOME/conf/ 아래에 있다.
- pom.xml
- 프로젝트 최상위 디렉터리에 “pom.xml”이라는 파일이 생성된다.
- pom.xml은 POM(Project Object Model)을 설정하는 부분으로 프로젝트 내 빌드 옵션을 설정하는 부분이다.
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.study</groupId>
<artifactId>Test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Test</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 프로젝트 정보
- modelVersion : maven의 pom.xml 모델 버전
- groupId : 프로젝트를 생성한 조직 또는 그룹명으로 보통 URL의 역순으로 지정한다.
- artifactId : 프로젝트의 생성되는 기본 아티팩트의 고유 이름이다.
- 메이븐에 의해 생성되는 일반적인 artifact는 artifact-version.extension 형식이다.
- version : 애플리케이션의 버전. 접미사로 SNAPSHOT이 붙으며 아직 개발단계라는 의미이다.
- 메이븐에서 라이브러리를 관리하는 방식이 다르다고 한다.
- packaging : jar, war, ear, pom 등 패키지 유형을 나타낸다.
- name : 프로젝트 명
- description : 프로젝트 설명
- url : 프로젝트를 찾을 수 있는 URL
- properties : pom.xml에서 중복해서 사용되는 설정 값들을 지정해놓는 부분으로 다른 위치에서 $(…)로 표기해서 사용할 수 있다.
- 위 pom.xml에서 java version 을 1.8로 적용하고 다른 위치에서 $(java.version)이라고 쓰면 1.8이라고 쓴 것과 같다.
-
profiles : 릴리즈를 나눠야 할 필요가 있는 설정 값은 profiles로 설정할 수 있다. (dev, prod)
<profiles> <profile> <id>dev</id> <properties> <java.version>1.8</java.version> </properties> </profile> <profile> <id>prod</id> <properties> <java.version>1.9</java.version> </properties> </profile> </profiles>
- maven goal 부분에 -P옵션으로 프로파일을 선택할 수 있다.
- maven compile -P prod라고 하면 $(java.versoin)은 1.9가 된다.
- 의존성 라이브러리 정보
- 의존성 라이브러리 정보를 적을 수 있다.
- dependencies 안에 작성되며 dependency 안에 groupId, artifactId, version 정보가 필요하다.
- groupId는 Java의 패키지 이름 규칙을 따라야 함 즉 제어하는 도메인 이름의 반대로 시작
- artifactId는 JAR 파일의 이름
- 부모 pom.xml에서 이미 버전정보가 있는 dependency에 경우 version은 따로 지정할 필요가 없다.
- 스프링부트는 스프링버전에 맞는 버전으로 이미 설정되어 있기 때문에 오버라이드해서 문제가 생길 수 있다.
- A라는 라이브러리를 사용하는데 B,C,D가 의존성을 가진다면 A를 dependency에 추가하면 자동으로 필요한 B,C,D도 가져오는 기능이 있다.
- dependency에 scope
- compile : 기본 scope. 미입력시에도 기본 적용, 모든 상황에서 포함됨
- provided : compile과 유사하게 모든 상황에서 수행된다.
- 하지만, 다른 외부 컨테이너에서 기본 제공되는 API인경우 provided로 지정 시 마지막 패키징할 때 포함되지 않음
- 예를 들면 tomcat에서 기본적으로 servlet api를 제공하기 때문에 servlet api를 provided로 지정하면 패키징시 제외된다.
- runtime : 컴파일 시에는 불필요 실행시에 필요한 경우. 런타임 및 테스트 시 classpath에 추가 되지만, 컴파일시에는 추가 되지 않음
- test : 테스트시에만 사용
- system : provided와 유사, system의 특정 path를 참조하도록 지정, Maven의 central repository를 사용하지 않음
- import : scope는 dependencyManagement 섹션에서 pom의 의존관계에 대해 사용
- build 정보
- build tool : maven의 핵심인 빌드와 관련된 정보를 설정할 수 있는 곳이다.
- build 부분에서 설정할 수 있는 값들에 대해 설명하기 전에 “라이프 사이클(life-cycle”에 대해서 알 필요가 있다.
- 객체의 생명주기처럼 maven에는 라이프 사이클이 존재한다.
- 크게 build, clean, site 라이프 사이클로 나누고 세부적으로 페이즈(phase) 있다.
- clean: pre-clean, clean, post-clean
- build: validate … compile … test … package … verify … install … deploy
- site: pre-site, site, post-site, deploy
- 메이븐의 모든 기능은 플러그인(plugin)을 기반으로 동작한다.
- 플러그인에서 실행할 수 있는 각각의 작업을 골(goal)이라하고 하나의 페이즈는 하나의 골과 연결되며, 하나의 플러그인에는 여러 개의 골이 있을 수 있다.
- 설정 값
- finalName : 빌드 결과물(ex .jar) 이름 설정
- resources : 리소스(각종 설정 파일)의 위치를 지정할 수 있다.
- resource : 없으면 기본으로 “src/main/resources”
- testResources : 테스트 리소스의 위치를 지정할 수 있다.
- testResource : 없으면 기본으로 “src/test/resources”
- Repositories : 빌드할 때 접근할 저장소의 위치를 지정할 수 있다. 기본적으로 메이븐 중앙 저장소인 http://repo1.maven.org/maven2로 지정되어 있다.
- outputDirectory : 컴파일한 결과물 위치 값 지정, 기본 “target/classes”
- testOutputDirectory : 테스트 소스를 컴파일한 결과물 위치 값 지정, 기본 “target/test-classes”
- plugin : 어떠한 액션 하나를 담당하는 것으로 가장 중요하지만 들어가는 옵션은 제 각각이다. 다행인 것은 플러그인 형식에 대한 것은 안내가 나와있으니 그것을 참고해서 작성하면 된다.
- plugin이 작성되어 있다고 무조건 실행되는 것은 아니다. 명확한 것은 아니지만 따로 실행할 플러그인을 메이븐 명령어로 실행해야 하는 것으로 알고 있다.
- executions : 플러그인 goal과 관련된 실행에 대한 설정
- configuration : 플러그인에서 필요한 설정 값 지정
- Repository
- 의존성을 다운로드 받을 위치의 repository
- 기술되지 않을 시 기본적인 위치 (http://repo.maven.apache.org/maven2)
- 다수의 repository 기술 가능
- 회사 내부의 repository를 기술 하기도 한다.
- nexus
- artifactory를 이용
<repositories> <repository> <id>spring-snapshot</id> <name>Spring Snapshot Repository</name> <url>https://repo.spring.io/snapshot</url> <snapshots> <enabled>true</enabled> </snapshots> <releases> <enabled>false</enabled> </releases> </repository> </repositories>
- Plugin Repository
- maven plugin을 다운로드 받을수 있는 저장소 위치를 기술
<pluginRepositories> <pluginRepository> <id>acme corp</id> <name>Acme Internal Corporate Repository</name> <url>http://acmecorp.com/plugins</url> <snapshots> <enabled>true</enabled> </snapshots> <releases> <enabled>false</enabled> </releases> </pluginRepository> </pluginRepositories>
- 배포
<project> ... <distributionManagement> <site> <id>website</id> <url>scp://www.mycompany.com/www/docs/project/</url> </site> </distributionManagement> ... </project>
- 사이트로 배포할 때 위와 같이 설정할 수도 있다.
pom.xml의 부모: spring-boot-starter-parent.xml
- spring-boot-starter-parent.xml에 부모는 spring-boot-dependencies 이다.
- parent에 있는 dependency를 사용하면, 버전이 적지 않아도 알아서 가져올 수 있다.
- 특별하게 원하는 버전이 있으면, 적으면 overriding이 된다.
- 트리 구조로 dependency가 연결되어 있다.
- (pom.xml -> spring-boot-starter-parent -> spring-boot-dependencies - … )
- Dependencies form 의 dependency
- SpringBoot 폼에 명시된 의존성을 사용하면 버전을 명시하지 않아도 SpringBoot 폼에서 정의된 의존성을 가져와서 사용
- Maven Dependencies -> Dependency management
- 우리가 관리해야 하는 일이 줄어드는 것
- 버전은 오버라이딩 가능
- Plugin -> 하나의 JAR 파일을 만들어 독립적인 실행이 가능하도록 해준다.
- 트리 구조로 dependency가 연결되어 있다.
- Pom.xml의 Parent 폼이 아닌 다른 구조를 쓰는 법
- 추가하고 싶은 프로젝트를 parent 폼의 넣은 후, 해당 프로젝트의 parent로 spring-boot-starter를 넣으면 된다.
- Parent를 타고 타고 들어와서 의존성 관리를 받을 수 있다.
- Parent 폼 변경 안하고,
Element를 사용하면 된다. - depedencyManagement 는 dependency 영역만 가져와 사용하는거다.
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.0.3.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
- 단점. 의존 관리뿐 아닌 프로젝트에 필요한 환경에 대한 설정(encoding, java version, plugin …) 이 제대로 먹히질 않는다.
- Parent를 사용하는 것이 기본 세팅을 사용하기(dependency+encoding ..etc) 훨씬 편리하다.
- 출처: https://jeong-pro.tistory.com/168
- 출처: 백기선님 Spring Boot
- 출처: Maven 정복 https://wikidocs.net/book/1910