Maven은 Java 프로젝트의 빌드를 자동화 해주는 빌드 툴로, Apache Ant의 대안으로 출시되었다.
pom.xml
에 정의해 놓으면 라이브러리를 다운받을 수 있다.pom.xml
구조우선 예시로 살펴 볼 전체 구조는 아래와 같다. (출처 : Maven guide)
<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>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
</plugins>
</pluginManagement>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
<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>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<name>songareeit</name>
...
</project>
Properties (선택) : 주로 반복적으로 사용될 상수 값을 정의할 때 사용한다.
<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<environment>dev<environment>
</properties>
Profiles (선택) : 각각 다른 설정 파일과 개발 환경을 구축할 때 사용한다.
프로필을 어떻게 사용할 지는 아래 Goal 파트에서 함께 설명하겠다.
<profiles>
<profile>
<id>local</id>
<properties>
<environment>local</environment>
</properties>
</profile>
<profile>
<id>dev</id>
<properties>
<environment>dev</environment>
</properties>
</profile>
<profiles>
Dependencies (필수) : 의존성 라이브러리 정보를 포함하여, 라이브러리를 불러오는 부분이다.
아래에서 scope
는 라이브러리가 프로젝트 내에서 사용될 범위를 명시한다.
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>x.y.z</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
Build (필수) : 디렉터리 구조로 project 태그 하위에 구성된다.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>x.y.z</version>
...
</plugin>
</plugins>
</build>
Maven이 행할 수 있는 여러가지 동작을 수행하는 명령을 말하며, 체인 형태로 실행 가능하다.
mvn [goal 명령어1] [goal 명령어2] [goal 명령어3]
mvn clean package
mvc clean package -P local
target/classes
디렉토리에 복사compile
수행 후, 테스트 수행, <packaging>
정보에 따라 패키징 수행package
수행 후, local repo에 install 수행install
수행 후, 배포 수행, 여기서 배포는 웹서버에 배포가 아니다. 회사 repo에 배포다.distributionManagement
항목이 기술되어야 한다. ...
<distributionManagement>
<repository>
<id>releases-repo</id>
<name>Releases Repository</name>
<url>회사repository주소(넥서스)</url>
</repository>
</distributionManagement>
...
Gradle은 Maven에 대해 논할 때 항상 비교가 되는 대상이다.
Java
C/C++
Python
등을 지원한다.아래는 구글 트렌드에서 2023년 8월 1일 기준으로 지난 1년간 구글에서 나타내는 트렌드 비교이다.
좌측) 전 세계 기준, 우측) 대한민국 기준
위에서 Gradle이 좋은 점은 분명히 있다. (실제로 Gradle 공식 홈페이지를 가면 Maven과의 비교도 볼 수 있다.)
대한민국에서는 Gradle과 Maven의 비율이 비슷한데, 전 세계를 기준으로 보면 Maven이 압도적이다.
각자 프로젝트 환경에 적합한 빌드 방식을 택하자!
추가로 알아두면 좋을 내용
- Maven 라이프사이클
유익한 글이었습니다.