Maven

  • Maven은 프로젝트 빌드 , 라이프 사이클 , 라이브러리 의존성 관리 등 프로젝트 전반을 위한 관리 도구이다. 최근에는 gradle도 프로젝트 관리 도구로 자주 사용되는데, gradle은 DSL 언어로 설정하고, maven은 gradle과 다르게 xml 언어로 프로젝트 구조를 관리한다. 그외의 차이점은 https://www.geeksforgeeks.org/difference-between-gradle-and-maven/ 에서 자세히 확인 할 수 있다.

Maven 프로젝트의 기본구조

1
2
3
4
5
6
7
8
9
10
- src
- main
- java
- resources
- webapp
- test
- java
- resources

- target
  • src/main/java : Java 소스 파일 위치

  • src/main/resources : property 또는 xml 등 resource 파일이 위치하며 , classpath 에 포함된다.

  • src/main/webapp : 웹 application 관련 파일들이 위치한다. (WEB-INF , template 파일 )

  • src/test/java : 테스트 Java 소스 파일 위치

  • src/test/resources : 테스트 과정에서 사용되는 resource 파일이 위치하며 , 테스트에 사용되는 classpath에 포함된다.

  • target/classes : 컴파일 된 결과 (.class file)

Maven 기본 명령어

  • mvn package : 배포 가능한 jar file을 빌드해서 target 폴더 안에 생성한다.

pom.xml 파일

  • maven 프로젝트를 생성하면 자동으로 pom.xml 파일이 프로젝트 루트 폴더에 생성되는데, 이 파일에서 주로 다루고 있는 설정 정보는 다음과 같다.
  • 프로젝트 정보 : 프로젝트 이름 , 라이센스 등
  • 빌드 설정 : life cycle별 실행할 plugin등 빌드와 관련된 설정을 기술
  • 빌드 환경
  • POM 연관 정보 : 의존 외부 library
  • groupId는 주로 회사의 정보를 입력하며 , 패키지 형태로 계층을 표현한다. ex) com.회사명
  • artifactId : 프로젝트 결과물의 식별자
  • package : 생성할 패키지명을 입력하는 데 , default로는 groupId.artifcatId 와 동일한 패키지명을 생성하게 된다.
  • packaging : 패키징 타입 (.war 또는 .jar) 설정
  • dependencies : 해당 프로젝트가 의존하고 있는 외부 라이브러리 정보를 기입한다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    <?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>net.madvirus</groupId> <!--프로젝트의 그룹id-->
    <artifactId>sample</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging> <!--패키징 타입 설정 -->
    <name>sample</name> <!--프로젝트명-->
    <url>http://www.example.com</url><!--프로젝트 사이트 url -->

    <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    </properties>

    <dependencies>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
    </dependency>
    </dependencies>

    <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
    <plugins>
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
    <source>1.8</source>
    <target>1.8</target>
    </configuration>
    </plugin>
    </plugins>
    </pluginManagement>
    </build>
    </project>

Dependency scope

  • pom.xml 파일에서 dependency 코드를 보면 <scope> 를 포함하는 경우가 있는데, <scope>는 의존하는 모듈이 언제 사용되는지 설명한다.

    • compile : default값으로 컴파일할 떄 필요하다. 테스트 및 런타임에도 포함된다.
    • runtime : compile할떄 필요하진 않지만, runtime에만 필요한 경우로, 배포 시 포함된다. ex) JDBC 드라이버
    • provided : compile할떄는 필요하지만, 실제 runtime떄에는 WAS container에서 기본적으로 제공해서 배포시에는 제외된다. ex) Servlet , lombok
    • test : 테스트 코드를 컴파일 할 때 필요로 한다. 배포 시에는 당연히 제외된다.

원격 repository와 로컬 repository

  • maven은 compile이나 packageing 등 작업을 수행할떄 필요한 plugin이나 depedency 에 기입된 라이브러리를 메이븐 중앙 repository (원격 repository)에서 다운받는다.

(중앙 repository : https://repo1.maven.org/maven2/)

  • 원격 repository에서 다운받은 모듈은 local repository에 저장되는데 , [USER_HOME]/.m2/repository 폴더에 생성된다. 여기에는 해당 jar file 그리고 해당 jar file이 필요한 또 다른 의존관계에 있는 library를 기입하고 있는 pom.xml 파일을 포함하고 있다.

Maven lifeCycle

  • lifeCycle의 특정단계를 수행하려면 mvn test , mvn clean과 같이 수행할 수 있다. 이떄 특정 단계를 수행하면 그 앞 단계의 모든 단계를 실행한다. 예를 들면 mvn test를 수행하면 validate 과정부터 prepare-package 과정까지 순서대로 실행한다.

  • plugin으로 직접 단계를 수행할수 있다. 이떄는 앞 단계가 전부 수행되는게 아니라 특정 plugin에서 특정 기능을 수행하는 형태로 돌아간다.

1
mvn surefire:test  // mvn plugin지정:수행할기능

Comments